Python socket编程实例详解


Posted in Python onMay 27, 2015

本文实例形式较为详细的讲述了Python socket编程。分享给大家供大家参考。具体如下:

sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

上面的代码创建了一个socket对象。type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)。AF_INET表示创建的是ip v4的类型。
socket(address_family,type,protocol_type):

上面三个参数的含义是:

address_family指明要建立哪一类socket。最常用的当然是ip协议,AF_INET。在unix系统中,AF_UNIX也是比较常用的,用于建立unix系统中的进程间通信。

type用于指定通信类型。通常是建立面向连接的流通信。SOCKET_DGRAM是报文通信。如果address_family设置的是AF_INET,那么对应的是TCP和UDP。

protocol用于指定协议类型。这个参数是可选的。在建立tcp或者是udp连接的时候他们通常都是0。如果第一个参数是AF_INET,那么这个参数表示是ip包中的protocol字段。

【UDP本来就不区分server和client。所有节点都是对等的】

第二步是将socket绑定到指定的地址:

sock.bind(('localhost',7556))

第三步是使用listen方法监听请求:【listen方法中的参数指明可接受的最大连接数】
sock.listen(5)

第四步是不断接收请求:收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求。
connection,address = sock.accept()

accept方法返回一个含有两个元素的 元组(connection,address)。第一个元素connection是新的socket对象,服务器必须通过它与客户通信;第二个元素 address是客户的Internet地址。
第五步是处理阶段,服务器和客户端通过send和recv方法通信(传输数据)。

如果send成功了,那么对方的缓冲区已经有你发送的数据了。
#调用recv 时,服务器必须指定一个整数,它对应于可通过本次方法调用来接收的最大数据量。recv方法在接收数据时会进入“blocked”状态,最后返回一个字符 串,用它表示收到的数据。如果发送的数据量超过了recv所允许的,数据会被截短。多余的数据将缓冲于接收端。以后调用recv时,多余的数据会从缓冲区 删除(以及自上次调用recv以来,客户可能发送的其它任何数据)。

connection.settimeout(5)
buf = connection.recv(1024)

具体处理如下:

if buf == '1':
  connection.send('welcome to python server!')
else:
  connection.send('please go out!')

使用send发送数据给客户端。客户端使用recv来接收数据。

import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost',7556))
import time
time.sleep(2)
sock.send('1')
print sock.recv(1024)
sock.close()

这就是整个通信过程了。

全部代码如下:

server端:

#!/usr/bin/env python
import socket
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind(('localhost',7556))
sock.listen(5)
while True:
  connection,address = sock.accept()
  print "client ip is "
  print address
  try:
    connection.settimeout(5)
    buf = connection.recv(1024)
    if buf == '1':
      connection.send('welcome to python server!')
    else:
      connection.send('please go out!')
  except socket.timeout:
    print 'time out'
  connection.close()

client端如下:

#!/usr/bin/env python
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost',7556))
import time
time.sleep(2)
sock.send('1')
print sock.recv(1024)
sock.close()

记住,socket使用完毕之后要关闭。【上面的代码,server端忘记关闭socket了】
当然,在socket连接的过程中,最好使用try except来做一下错误处理。

注意,accept函数和recv函数都是阻塞式的。也就是说,他们一直在等待,直到有客户端连接过来或者是后者的有数据可以接收。

下面是一个FTP的小例子。

使用了多线程来处理每一个请求。

示例代码点击此处本站下载。

如果传输路径不存在则建立。

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
跨平台python异步回调机制实现和使用方法
Nov 26 Python
总结用Pdb库调试Python的方式及常用的命令
Aug 18 Python
Python利用itchat对微信中好友数据实现简单分析的方法
Nov 21 Python
Python下使用Scrapy爬取网页内容的实例
May 21 Python
python求质数的3种方法
Sep 28 Python
Python将字符串常量转化为变量方法总结
Mar 17 Python
python动态视频下载器的实现方法
Sep 16 Python
利用python Selenium实现自动登陆京东签到领金币功能
Oct 31 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
Nov 11 Python
Pytorch之Tensor和Numpy之间的转换的实现方法
Sep 03 Python
Python批量修改xml的坐标值全部转为整数的实例代码
Nov 26 Python
上手简单,功能强大的Python爬虫框架——feapder
Apr 27 Python
Python简单删除目录下文件以及文件夹的方法
May 27 #Python
python解析xml文件实例分析
May 27 #Python
Python定时执行之Timer用法示例
May 27 #Python
python定时执行指定函数的方法
May 27 #Python
python统计文本字符串里单词出现频率的方法
May 26 #Python
python通过get,post方式发送http请求和接收http响应的方法
May 26 #Python
python使用urllib2提交http post请求的方法
May 26 #Python
You might like
php中PDO方式实现数据库的增删改查
2015/05/17 PHP
php实现的简单检验登陆类
2015/06/18 PHP
php微信浏览器分享设置以及回调详解
2016/08/01 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
discuz论坛更换域名,详细文件修改步骤
2020/12/09 PHP
学习ExtJS form布局
2009/10/08 Javascript
ASP中进行HTML数据及JS数据编码函数
2009/11/11 Javascript
JS多物体 任意值 链式 缓冲运动
2012/08/10 Javascript
flash+jQuery实现可关闭及重复播放的压顶广告
2015/04/15 Javascript
smartcrop.js智能图片裁剪库
2015/10/14 Javascript
JavaScript+html5 canvas绘制的圆弧荡秋千效果完整实例
2016/01/26 Javascript
微信小程序 触控事件详细介绍
2016/10/17 Javascript
基于 flexible 的 Vue 组件:Toast -- 显示框效果
2017/12/26 Javascript
微信公众号H5之微信分享常见错误和问题(小结)
2019/11/14 Javascript
vuex 多模块时 模块内部的mutation和action的调用方式
2020/07/24 Javascript
小程序实现左滑删除的效果的实例代码
2020/10/19 Javascript
JS数据类型分类及常用判断方法
2020/11/19 Javascript
python字符串替换的2种方法
2014/11/30 Python
Django实现快速分页的方法实例
2017/10/22 Python
python 读入多行数据的实例
2018/04/19 Python
Python使用matplotlib实现基础绘图功能示例
2018/07/03 Python
python中scikit-learn机器代码实例
2018/08/05 Python
python 格式化输出百分号的方法
2019/01/20 Python
详解Python绘图Turtle库
2019/10/12 Python
基于python实现检索标记敏感词并输出
2020/05/07 Python
中国一家专注拼团的社交购物网站:拼多多
2018/06/13 全球购物
支教自我鉴定
2014/01/18 职场文书
《石榴》教学反思
2014/03/02 职场文书
《曹刿论战》教学反思
2014/03/02 职场文书
企业业务员岗位职责
2014/03/14 职场文书
生产文员岗位职责
2014/04/05 职场文书
镇人大副主席民主生活会对照检查材料思想汇报
2014/10/01 职场文书
赔偿协议书怎么写
2015/01/28 职场文书
安全教育的主题班会
2015/08/13 职场文书
JPA 通过Specification如何实现复杂查询
2021/11/23 Java/Android
Fluentd搭建日志收集服务
2022/09/23 Servers