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 相关文章推荐
Python实现的一个简单LRU cache
Sep 26 Python
numpy中实现ndarray数组返回符合特定条件的索引方法
Apr 17 Python
使用PM2+nginx部署python项目的方法示例
Nov 07 Python
python利用百度AI实现文字识别功能
Nov 27 Python
python matplotlib画图库学习绘制常用的图
Mar 19 Python
关于python字符串方法分类详解
Aug 20 Python
python tkinter图形界面代码统计工具(更新)
Sep 18 Python
浅析PEP572: 海象运算符
Oct 15 Python
python实现的读取网页并分词功能示例
Oct 29 Python
python GUI库图形界面开发之PyQt5树形结构控件QTreeWidget详细使用方法与实例
Mar 02 Python
python中spy++的使用超详细教程
Jan 29 Python
Python实现排序方法常见的四种
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
DOTA2游戏同人动画《龙之血》导演接受采访
2021/03/05 欧美动漫
ubuntu下编译安装xcache for php5.3 的具体操作步骤
2013/06/18 PHP
PHP中对于浮点型的数据需要用不同的方法解决
2014/03/11 PHP
php字符串函数学习之strstr()
2015/03/27 PHP
PHP从二维数组得到N层分类树的实现代码
2016/10/11 PHP
js中数组Array的一些常用方法总结
2013/08/12 Javascript
JS简单的图片放大缩小的两种方法
2013/11/11 Javascript
jQuery动态显示和隐藏datagrid中的某一列的方法
2013/12/11 Javascript
编写高性能Javascript代码的N条建议
2015/10/12 Javascript
JS弹出对话框实现方法(三种方式)
2015/12/18 Javascript
详解Bootstrap创建表单的三种格式(一)
2016/01/04 Javascript
阿里云ecs服务器中安装部署node.js的步骤
2016/10/08 Javascript
xmlplus组件设计系列之下拉刷新(PullRefresh)(6)
2017/05/03 Javascript
JavaScrpt的面向对象全面解析
2017/05/09 Javascript
实例讲解DataTables固定表格宽度(设置横向滚动条)
2017/07/11 Javascript
vue组件父与子通信详解(一)
2017/11/07 Javascript
JavaScript面向对象继承原理与实现方法分析
2018/08/09 Javascript
json前后端数据交互相关代码
2018/09/19 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变rgba的a值实现)
2019/01/24 Javascript
Vue 自定义指令功能完整实例
2019/09/17 Javascript
JS自定义右键菜单实现代码解析
2020/07/16 Javascript
浅谈JS for循环中使用break和continue的区别
2020/07/21 Javascript
Python获取文件所在目录和文件名的方法
2017/01/12 Python
Python中logging实例讲解
2019/01/17 Python
Python3.5 Pandas模块之Series用法实例分析
2019/04/23 Python
python将类似json的数据存储到MySQL中的实例
2019/07/12 Python
Python求解排列中的逆序数个数实例
2020/05/03 Python
Selenium webdriver添加cookie实现过程详解
2020/08/12 Python
Nordgreen手表德国官方网站:丹麦极简主义手表
2019/10/31 全球购物
如果让你测试一台高速激光打印机,你都会进行哪些测试
2012/12/04 面试题
外企求职信范文分享
2013/12/31 职场文书
中职招生先进个人材料
2014/08/31 职场文书
学习三严三实心得体会
2014/10/13 职场文书
2014年企业党支部工作总结
2014/12/04 职场文书
狮子林导游词
2015/02/03 职场文书
幼儿园奖惩制度范本
2015/08/05 职场文书