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 Django模板的使用方法
Jan 14 Python
Python生成随机密码的方法
Jun 16 Python
numpy中实现二维数组按照某列、某行排序的方法
Apr 04 Python
python求最大连续子数组的和
Jul 07 Python
Python使用sqlalchemy模块连接数据库操作示例
Mar 13 Python
python实现简易学生信息管理系统
Apr 05 Python
python3中numpy函数tile的用法详解
Dec 04 Python
浅谈Python3多线程之间的执行顺序问题
May 02 Python
实现ECharts双Y轴左右刻度线一致的例子
May 16 Python
python filecmp.dircmp实现递归比对两个目录的方法
May 22 Python
Python如何用wx模块创建文本编辑器
Jun 07 Python
Python 操作 MySQL数据库
Sep 18 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
mysql5详细安装教程
2007/01/15 PHP
如何在Ubuntu下启动Apache的Rewrite功能
2013/07/05 PHP
Yii使用技巧大汇总
2015/12/29 PHP
PHP判断是否是微信打开还是浏览器打开的方法
2019/02/27 PHP
js自带函数备忘 数组
2006/12/29 Javascript
IE iframe的onload方法分析小结
2010/01/07 Javascript
今天是星期几的4种JS代码写法
2013/09/17 Javascript
js中string转int把String类型转化成int类型
2014/08/13 Javascript
JQuery中serialize()用法实例分析
2015/02/06 Javascript
javascript中arguments,callee,caller详解
2016/03/16 Javascript
jQuery与JS加载事件用法分析
2016/09/04 Javascript
js控制台输出的方法(详解)
2016/11/26 Javascript
jquery利用json实现页面之间传值的实例解析
2016/12/12 Javascript
vue学习之mintui picker选择器实现省市二级联动示例
2017/10/12 Javascript
AngularJS 中的数据源的循环输出
2017/10/12 Javascript
vue 文件目录结构详解
2017/11/24 Javascript
vue采用EventBus实现跨组件通信及注意事项小结
2018/06/14 Javascript
jQuery实现获取选中复选框的值实例详解
2018/06/28 jQuery
js canvas实现二维码和图片合成的海报
2020/11/19 Javascript
vue-better-scroll 的使用实例代码详解
2018/12/03 Javascript
vue使用vuex实现首页导航切换不同路由的方法
2019/05/08 Javascript
Python使用PIL模块生成随机验证码
2017/11/21 Python
Python数据结构之栈、队列的实现代码分享
2017/12/04 Python
python迭代dict的key和value的方法
2018/07/06 Python
python使用requests.session模拟登录
2019/08/09 Python
python怎么提高计算速度
2020/06/11 Python
CSS3+HTML5+JS 实现一个块的收缩与展开动画效果
2020/11/17 HTML / CSS
Chain Reaction Cycles芬兰:世界上最大的在线自行车商店
2017/12/06 全球购物
酒吧副总经理岗位职责
2013/12/10 职场文书
入党自我评价优缺点
2014/01/25 职场文书
入学申请自荐信范文
2014/02/26 职场文书
班组长竞聘书
2014/03/31 职场文书
群众路线对照检查材料
2014/09/22 职场文书
少年派的奇幻漂流观后感
2015/06/08 职场文书
保护动物的宣传语
2015/07/13 职场文书
关于Python OS模块常用文件/目录函数详解
2021/07/01 Python