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 相关文章推荐
wxPython框架类和面板类的使用实例
Sep 28 Python
python编程实现归并排序
Apr 14 Python
Python实现从log日志中提取ip的方法【正则提取】
Mar 31 Python
解决pandas read_csv 读取中文列标题文件报错的问题
Jun 15 Python
Python3模拟登录操作实例分析
Mar 12 Python
使用Python实现 学生学籍管理系统
Nov 26 Python
pytorch中的卷积和池化计算方式详解
Jan 03 Python
利用python在excel中画图的实现方法
Mar 17 Python
Python数据正态性检验实现过程
Apr 18 Python
Python urllib.request对象案例解析
May 11 Python
解决python3安装pandas出错的问题
May 20 Python
python中sqllite插入numpy数组到数据库的实现方法
Jun 21 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
UCenter中的一个可逆加密函数authcode函数代码
2010/07/20 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
2016/05/22 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
PHP实现基于PDO扩展连接PostgreSQL对象关系数据库示例
2018/03/31 PHP
VBScript版代码高亮
2006/06/26 Javascript
33个优秀的jQuery 教程分享(幻灯片、动画菜单)
2011/07/08 Javascript
jQuery 淡入淡出 png图在ie8下有黑色边框的解决方法
2013/03/05 Javascript
js常用数组操作方法简明总结
2014/06/20 Javascript
Javascript学习笔记之 函数篇(三) : 闭包和引用
2014/11/23 Javascript
基于vue 实现token验证的实例代码
2017/12/14 Javascript
微信小程序实现折叠面板
2018/01/31 Javascript
js canvas实现红包照片效果
2018/08/21 Javascript
JavaScript实现省市联动效果
2019/11/22 Javascript
package.json各个属性说明详解
2020/03/11 Javascript
js实现移动端轮播图滑动切换
2020/12/21 Javascript
在Python的Django框架的视图中使用Session的方法
2015/07/23 Python
Python随机生成数据后插入到PostgreSQL
2016/07/28 Python
python中MethodType方法介绍与使用示例
2017/08/03 Python
PyQt4实现下拉菜单可供选择并打印出来
2018/04/20 Python
Anaconda 离线安装 python 包的操作方法
2018/06/11 Python
使用python 3实现发送邮件功能
2018/06/15 Python
详解python路径拼接os.path.join()函数的用法
2019/10/09 Python
matplotlib绘制多个子图(subplot)的方法
2019/12/03 Python
解决pycharm最左侧Tool Buttons显示不全的问题
2019/12/17 Python
Python3 pywin32模块安装的详细步骤
2020/05/26 Python
HTML5、Select下拉框右边加图标的实现代码(增进用户体验)
2017/10/16 HTML / CSS
static函数与普通函数有什么区别
2015/12/25 面试题
市场营销专业个人求职信范文
2013/12/14 职场文书
工伤事故赔偿协议书
2014/04/15 职场文书
经贸日语专业自荐信
2014/09/02 职场文书
税务职业生涯规划书范文
2014/09/16 职场文书
承诺书范本
2015/01/21 职场文书
酒店财务部岗位职责
2015/04/14 职场文书
掌握一个领域知识,高效学习必备方法
2019/08/08 职场文书
Redis中一个String类型引发的惨案
2021/07/25 Redis
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
2022/04/21 Python