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实现类的静态变量用法实例
May 08 Python
python登录豆瓣并发帖的方法
Jul 08 Python
Python使用Paramiko模块编写脚本进行远程服务器操作
May 05 Python
python 写入csv乱码问题解决方法
Oct 23 Python
Python 中 list 的各项操作技巧
Apr 13 Python
python+selenium开发环境搭建图文教程
Aug 11 Python
Python实现字典的遍历与排序功能示例
Dec 23 Python
Python常见字符串操作函数小结【split()、join()、strip()】
Feb 02 Python
解决pip install的时候报错timed out的问题
Jun 12 Python
pytorch AvgPool2d函数使用详解
Jan 03 Python
Python ORM编程基础示例
Feb 02 Python
通过python-pptx模块操作ppt文件的方法
Dec 26 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服务器配置说明
2006/10/09 PHP
PHP中imagick函数的中文解释
2015/01/21 PHP
PHP+apc+ajax实现的ajax_upload上传进度条代码
2016/01/25 PHP
PHP编写的图片验证码类文件分享
2016/06/06 PHP
JS location几个方法小姐
2008/07/09 Javascript
无闪烁更新网页内容JS实现
2013/12/19 Javascript
动态加载jquery库的方法
2014/02/12 Javascript
JavaScript中的small()方法使用详解
2015/06/08 Javascript
深入理解JavaScript中的箭头函数
2015/07/28 Javascript
全面解析Bootstrap排版使用方法(文字样式)
2015/11/30 Javascript
javascript HTML5 canvas实现打砖块游戏
2020/06/18 Javascript
逻辑表达式中与或非的用法详解
2016/06/06 Javascript
js友好的时间返回函数
2016/08/24 Javascript
基于JavaScript实现带缩略图的轮播效果
2017/01/12 Javascript
JS使用正则表达式找出最长连续子串长度
2017/10/26 Javascript
jQuery中图片展示插件highslide.js的简单dom
2018/04/22 jQuery
vue-auto-focus: 控制自动聚焦行为的 vue 指令方法
2018/08/25 Javascript
用npm安装vue和vue-cli,并使用webpack创建项目的方法
2018/09/28 Javascript
小程序测试后台服务的方法(ngrok)
2019/03/08 Javascript
使用vue-cli3+typescript的项目模板创建工程的教程
2020/02/28 Javascript
JavaScript中变量提升和函数提升的详解
2020/08/07 Javascript
Python的Flask框架中实现分页功能的教程
2015/04/20 Python
Python自定义类的数组排序实现代码
2016/08/28 Python
python实现Windows电脑定时关机
2018/06/20 Python
python计算两个数的百分比方法
2018/06/29 Python
用什么库写 Python 命令行程序(示例代码详解)
2020/02/20 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
2020/03/30 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
2020/04/08 Python
python3获取控制台输入的数据的具体实例
2020/08/16 Python
匡威意大利官方商店 :Converse意大利
2018/11/27 全球购物
银行出纳岗位职责
2013/11/25 职场文书
机械工程及其自动化专业求职信
2014/08/08 职场文书
党员对照检查材料整改措施思想汇报
2014/09/26 职场文书
教师党的群众路线教育实践活动个人整改措施
2014/11/04 职场文书
捐书活动倡议书
2015/04/27 职场文书
nginx部署多前端项目的几种方法
2021/05/25 Servers