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出现_warn_unsafe_extraction问题的方法
Mar 24 Python
Python实现随机生成有效手机号码及身份证功能示例
Jun 05 Python
python和flask中返回JSON数据的方法
Mar 26 Python
Linux下python制作名片示例
Jul 20 Python
Django Celery异步任务队列的实现
Jul 24 Python
自定义Django默认的sitemap站点地图样式
Mar 04 Python
Python 绘制可视化折线图
Jul 22 Python
Python matplotlib模块及柱状图用法解析
Aug 10 Python
python实现canny边缘检测
Sep 14 Python
浅谈Selenium 控制浏览器的常用方法
Dec 04 Python
pandas 按日期范围筛选数据的实现
Feb 20 Python
Python 求向量的余弦值操作
Mar 04 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小教程之实现链表
2014/06/09 PHP
php动态绑定变量的用法
2015/06/16 PHP
jquery form表单提交插件asp.net后台中文解码
2010/06/12 Javascript
悄悄用脚本检查你访问过哪些网站的代码
2010/12/04 Javascript
jquery实现的图片点击滚动效果
2014/04/29 Javascript
浅析webapp框架AngularUI的demo
2014/12/21 Javascript
JS实现文件动态顺序载入的方法
2015/03/07 Javascript
jQuery插件Tooltipster实现漂亮的工具提示
2015/04/12 Javascript
javascript实现手机震动API代码
2015/08/05 Javascript
通过学习bootstrop导航条学会修改bootstrop颜色基调
2017/06/11 Javascript
js实现轮播图的两种方式(构造函数、面向对象)
2017/09/30 Javascript
nodejs结合Socket.IO实现的即时通讯功能详解
2018/01/12 NodeJs
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
2018/03/27 Javascript
vue中keep-alive的用法及问题描述
2018/05/15 Javascript
webpack4.x打包过程详解
2018/07/18 Javascript
实例讲解JavaScript预编译流程
2019/01/24 Javascript
JS造成内存泄漏的几种情况实例分析
2020/03/02 Javascript
[51:10]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
使用C语言来扩展Python程序和Zope服务器的教程
2015/04/14 Python
使用Python导出Excel图表以及导出为图片的方法
2015/11/07 Python
python安装numpy&安装matplotlib& scipy的教程
2017/11/02 Python
Python中顺序表的实现简单代码分享
2018/01/09 Python
Python3基于sax解析xml操作示例
2018/05/22 Python
python实现C4.5决策树算法
2018/08/29 Python
5分钟 Pipenv 上手指南
2018/12/20 Python
PyQt5实现类似别踩白块游戏
2019/01/24 Python
Python通过2种方法输出带颜色字体
2020/03/02 Python
PyCharm设置Ipython交互环境和宏快捷键进行数据分析图文详解
2020/04/23 Python
通过cmd进入python的步骤
2020/06/16 Python
Python drop方法删除列之inplace参数实例
2020/06/27 Python
万得城电器土耳其网站:欧洲第一大电子产品零售商
2016/10/07 全球购物
伦敦奥运会口号
2014/06/13 职场文书
促销活动总结模板
2014/07/01 职场文书
护理专科学生自荐书
2014/07/05 职场文书
如何书写先进事迹材料?
2019/07/02 职场文书
MySQL插入数据与查询数据
2022/03/25 MySQL