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 相关文章推荐
Python3中简单的文件操作及两个简单小实例分享
Jun 18 Python
python编辑用户登入界面的实现代码
Jul 16 Python
Python多线程应用于自动化测试操作示例
Dec 06 Python
windows下numpy下载与安装图文教程
Apr 02 Python
Python PyPDF2模块安装使用解析
Jan 19 Python
Python3 xml.etree.ElementTree支持的XPath语法详解
Mar 06 Python
浅谈python3打包与拆包在函数的应用详解
May 02 Python
基于Python实现视频的人脸融合功能
Jun 12 Python
基于Keras的格式化输出Loss实现方式
Jun 17 Python
基于python实现坦克大战游戏
Oct 27 Python
python源文件的字符编码知识点详解
Mar 04 Python
Python+Tkinter打造签名设计工具
Apr 01 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
业余方法DIY电子管FM收音机
2021/03/02 无线电
第九节--绑定
2006/11/16 PHP
PHP微信开发之有道翻译
2016/06/23 PHP
PHP使用GD库输出汉字的方法【测试可用】
2016/11/10 PHP
对采用动态原型方式无法展示继承机制得思考
2009/12/04 Javascript
Jquery CheckBox全选方法代码附js checkbox全选反选代码
2010/06/09 Javascript
javascript 基础篇1 什么是js 建立第一个js程序
2012/03/14 Javascript
30分钟就入门的正则表达式基础教程
2013/02/25 Javascript
详解JavaScript中数组的相关知识
2015/07/29 Javascript
Javascript中匿名函数的调用与写法实例详解(多种)
2016/01/26 Javascript
Jqprint实现页面打印
2017/01/06 Javascript
AngularJS的Filter的示例详解
2017/03/07 Javascript
vue之数据交互实例代码
2017/06/20 Javascript
JavaScript判断输入是否为数字类型的方法总结
2017/09/28 Javascript
浅谈webpack编译vue项目生成的代码探索
2017/12/11 Javascript
解决循环中setTimeout执行顺序的问题
2018/06/20 Javascript
JavaScript设计模式之享元模式实例详解
2019/01/17 Javascript
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
2020/08/11 Javascript
[02:03]永远的信仰DOTA2 中国军团历届国际邀请赛回顾
2016/06/26 DOTA
[30:00]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第二场 11.28
2020/12/01 DOTA
Django中实现一个高性能计数器(Counter)实例
2014/07/09 Python
Django实现组合搜索的方法示例
2018/01/23 Python
python 实现对文件夹内的文件排序编号
2018/04/12 Python
解决Python print输出不换行没空格的问题
2018/11/14 Python
Python实现12306火车票抢票系统
2019/07/04 Python
检测python爬虫时是否代理ip伪装成功的方法
2019/07/12 Python
将自己的数据集制作成TFRecord格式教程
2020/02/17 Python
新手入门学习python Numpy基础操作
2020/03/02 Python
如何让Java程序执行效率更高
2014/06/25 面试题
PyQt 如何创建自定义QWidget
2021/03/24 Python
大学生自我鉴定范文
2013/12/28 职场文书
大学生怎样写好自荐信
2014/02/25 职场文书
党员群众路线承诺书
2014/05/20 职场文书
小学综治宣传月活动总结
2014/07/02 职场文书
音乐教师个人总结
2015/02/06 职场文书
利用js实现简单开关灯代码
2021/11/23 Javascript