python网络编程之TCP通信实例和socketserver框架使用例子


Posted in Python onApril 25, 2014

1.TCP是一种面向连接的可靠地协议,在一方发送数据之前,必须在双方之间建立一个连接,建立的过程需要经过三次握手,通信完成后要拆除连接,需要经过四次握手,这是由TCP的半关闭造成的,一方在完成数据发送后要发送一个FIN来终止这个方向的连接,一个TCP连接在收到一个FIN后仍能发送数据,但应用程序很少这么做,下面是TCP连接建立和拆除的过程:

python网络编程之TCP通信实例和socketserver框架使用例子python网络编程之TCP通信实例和socketserver框架使用例子

2.python可以实现TCP服务器和客户端的编程,下面是代码:

服务器端:

#!/usr/bin/env python
import socket
host="localhost"
port=10000
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((host,port))
s.listen(5)
while 1:
 sock,addr=s.accept()
 print "got connection form ",sock.getpeername()
 data=sock.recv(1024)
 if not data:
  break
 else:
  print data

客户端:

#!/usr/bin/env python
import socket
host="localhost"
port=10000
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((host,port))
s.send("hello from client")
s.close()

3.使用socketserver框架编写TCP服务器

    Socketserver模块可以简化网络服务器的编写,它包含了四种服务器类,TCPServer使用TCP协议,UDPServer使用UDP协议,还有两个不常使用的,即UnixStreamServer和UnixDatagramServer,这两个类仅仅在unix环境下有用。

    使用服务器编程,需要进行一下步骤,先建立一个请求句柄类,这个类继承自BaseRequestHandler类,建立这个类后重写它的handle方法,然后实例化服务器类,把主机名,端口号和句柄类传给它,然后调用server_forever()方法来处理请求。

   使用socketserver框架的服务器:

import SocketServer
host=''
port=10000
class Handler(SocketServer.StreamRequestHandler): def handler(self):
  addr=self.request.getpeername()
  print "got connection from",addr
  self.wfile.write("connected")
server=SocketServer.TCPServer((host,port),Handler)
server.serve_forever()

上面的socketserver服务器只能处理一个请求,如果要处理多个请求,可以用forking或者threading实现,实现多进程或者多线程服务器。下面是使用forking和threading的服务器代码:

使用forking的服务器:

from SocketServer import TCPServer,ForkingMixIn,StreamRequestHandler
class Server(ForkingMixIn,TCPServer):pass
class Handler(StreamRequestHandler): def handle(self):
  addr=self.request.getpeername()
  print "got connection from",addr
  self.wfile.write('connected')
server=Server((''.10000),Handler)
server.serve_forever()

使用多线程的服务器:

from SocketServer import TCPServer,ThreadingMixIn,StreamRequestHandler
class Server(ThreadingMixIn,TCPServer):pass
class Handler(StreamRequestHandler):
 def handle(self):
  addr=self.request.getpeername()
  print "got connection from",addr
  self.wfile.write("connected")
server=Server(('',10000),Handler)
server.serve_forever()
Python 相关文章推荐
Python3基础之基本运算符概述
Aug 13 Python
十条建议帮你提高Python编程效率
Feb 16 Python
使用Python写一个贪吃蛇游戏实例代码
Aug 21 Python
基于Python在MacOS上安装robotframework-ride
Dec 28 Python
python实现桌面壁纸切换功能
Jan 21 Python
基于PyQt4和PySide实现输入对话框效果
Feb 27 Python
Python实现将HTML转成PDF的方法分析
May 04 Python
Python帮你微信头像任意添加装饰别再@微信官方了
Sep 25 Python
解决Python使用列表副本的问题
Dec 19 Python
利用pandas向一个csv文件追加写入数据的实现示例
Apr 23 Python
宝塔面板成功部署Django项目流程(图文)
Jun 22 Python
手把手教你使用TensorFlow2实现RNN
Jul 15 Python
python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
Apr 25 #Python
python中合并两个文本文件并按照姓名首字母排序的例子
Apr 25 #Python
使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)
Apr 25 #Python
Python time模块详解(常用函数实例讲解,非常好)
Apr 24 #Python
Python 时间操作例子和时间格式化参数小结
Apr 24 #Python
python抓取网页图片并放到指定文件夹
Apr 24 #Python
python字符串替换示例
Apr 24 #Python
You might like
php中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
2011/05/04 PHP
解析PHP实现下载文件的两种方法
2013/07/05 PHP
浅谈discuz密码加密的方式
2014/05/22 PHP
PHP将进程作为守护进程的方法
2015/03/19 PHP
PHP使用Mysqli类库实现完美分页效果的方法
2016/04/07 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
PhpStorm配置Xdebug调试的方法步骤
2019/02/02 PHP
javascript 放大镜效果js组件 qsoft.PopBigImage.v0.35 加入了chrome支持
2009/04/07 Javascript
jquery插件 cluetip 关键词注释
2010/01/12 Javascript
火狐textarea输入法的bug的触发及解决
2013/07/24 Javascript
事件委托与阻止冒泡阻止其父元素事件触发
2014/09/02 Javascript
react性能优化达到最大化的方法 immutable.js使用的必要性
2017/03/09 Javascript
vue实现图书管理demo详解
2017/10/17 Javascript
js提取中文拼音首字母的封装工具类
2018/03/12 Javascript
vue中Npm run build 根据环境传递参数方法来打包不同域名
2018/03/29 Javascript
vue操作下拉选择器获取选择的数据的id方法
2018/08/24 Javascript
微信小程序时间选择插件使用详解
2018/12/28 Javascript
JavaScript实现随机五位数验证码
2019/09/27 Javascript
关于vue表单提交防双/多击的例子
2019/10/31 Javascript
用实例分析Python中method的参数传递过程
2015/04/02 Python
python使用fileinput模块实现逐行读取文件的方法
2015/04/29 Python
Python中的字符串操作和编码Unicode详解
2017/01/18 Python
人机交互程序 python实现人机对话
2017/11/14 Python
Python3使用正则表达式爬取内涵段子示例
2018/04/22 Python
python实现本地图片转存并重命名的示例代码
2018/10/27 Python
python从子线程中获得返回值的方法
2019/01/30 Python
pandas.read_csv参数详解(小结)
2019/06/21 Python
Ubuntu+python将nii图像保存成png格式
2019/07/18 Python
Django获取该数据的上一条和下一条方法
2019/08/12 Python
Python将主机名转换为IP地址的方法
2019/08/14 Python
Pytorch实现GoogLeNet的方法
2019/08/18 Python
保安部任务及岗位职责
2014/02/25 职场文书
洗发水广告词
2014/03/13 职场文书
论文评审意见
2015/06/05 职场文书
电台广播稿范文
2015/08/19 职场文书
MySQL 条件查询的常用操作
2022/04/28 MySQL