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生成随机验证码(中文验证码)示例
Apr 03 Python
python实现的DES加密算法和3DES加密算法实例
Jun 03 Python
Python基于pygame实现图片代替鼠标移动效果
Nov 11 Python
Django基础之Model操作步骤(介绍)
May 27 Python
python使用opencv驱动摄像头的方法
Aug 03 Python
对Python中Iterator和Iterable的区别详解
Oct 18 Python
[原创]Python入门教程3. 列表基本操作【定义、运算、常用函数】
Oct 30 Python
python dict 相同key 合并value的实例
Jan 21 Python
Python的互斥锁与信号量详解
Sep 12 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
Sep 25 Python
Python SMTP发送电子邮件的示例
Sep 23 Python
Python Numpy之linspace用法说明
Apr 17 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类常量用法实例分析
2015/07/09 PHP
PHP Ajax实现无刷新附件上传
2016/08/17 PHP
基于JQuery实现的类似购物商城的购物车
2011/12/06 Javascript
通过百度地图获取公交线路的站点坐标的js代码
2012/05/11 Javascript
js实现屏蔽默认快捷键调用自定义事件示例
2013/06/18 Javascript
JavaScript生成GUID的多种算法小结
2013/08/18 Javascript
jQuery获取cookie值及删除cookie用法实例
2016/04/15 Javascript
AngularJS基础 ng-keydown 指令简单示例
2016/08/02 Javascript
网页瀑布流布局jQuery实现代码
2016/10/21 Javascript
jquery select2的使用心得(推荐)
2016/12/04 Javascript
详解自动生成博客目录案例
2016/12/09 Javascript
JavaScript获取短信验证码(周期性)
2016/12/29 Javascript
Bootstrap按钮组实例详解
2017/07/03 Javascript
详谈Node.js之操作文件系统
2017/08/29 Javascript
JS实现二维数组横纵列转置的方法
2018/04/17 Javascript
JS获取并处理php数组的方法实例分析
2018/09/04 Javascript
bootstrap自定义样式之bootstrap实现侧边导航栏功能
2018/09/10 Javascript
vue实现弹框遮罩点击其他区域弹框关闭及v-if与v-show的区别介绍
2018/09/29 Javascript
vue路由前进后退动画效果的实现代码
2018/12/10 Javascript
JS拖动选择table里的单元格完整实例【基于jQuery】
2019/05/28 jQuery
python文件比较示例分享
2014/01/10 Python
Python程序设计入门(1)基本语法简介
2014/06/13 Python
python中实现定制类的特殊方法总结
2014/09/28 Python
python集合用法实例分析
2015/05/30 Python
Python中django学习心得
2017/12/06 Python
python实现数据导出到excel的示例--普通格式
2018/05/03 Python
python实现kmp算法的实例代码
2019/04/03 Python
python 实现压缩和解压缩的示例
2020/09/22 Python
制药工程专业应届生求职信
2013/09/24 职场文书
公司财务自我评价分享
2013/12/17 职场文书
个性与发展自我评价
2014/02/11 职场文书
端午节活动策划方案
2014/03/09 职场文书
小学美术兴趣小组活动总结
2014/07/07 职场文书
小学音乐课歌曲《堆雪人》教学反思
2016/02/18 职场文书
详解nginx安装过程并代理下载服务器文件
2022/02/12 Servers
解决linux下redis数据库overcommit_memory问题
2022/02/24 Redis