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 从远程服务器下载日志文件的程序
Feb 10 Python
Python3.2中Print函数用法实例详解
May 19 Python
Python编程使用*解包和itertools.product()求笛卡尔积的方法
Dec 18 Python
python绘制漏斗图步骤详解
Mar 04 Python
GitHub 热门:Python 算法大全,Star 超过 2 万
Apr 29 Python
Python图像处理模块ndimage用法实例分析
Sep 05 Python
Python数据结构dict常用操作代码实例
Mar 12 Python
python根据完整路径获得盘名/路径名/文件名/文件扩展名的方法
Apr 22 Python
Pycharm无法打开双击没反应的问题及解决方案
Aug 17 Python
教你如何用python操作摄像头以及对视频流的处理
Oct 12 Python
基于python获取本地时间并转换时间戳和日期格式
Oct 27 Python
Python+SeaTable实现计算两个日期间的工作日天数
Jul 07 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 HTML代码串截取代码
2008/12/29 PHP
基于PHP读取csv文件内容的详解
2013/06/18 PHP
Codeigniter(CI)框架分页函数及相关知识
2014/11/03 PHP
Mac系统下使用brew搭建PHP(LNMP/LAMP)开发环境
2015/03/03 PHP
php返回相对时间(如:20分钟前,3天前)的方法
2015/04/14 PHP
PHP实现的服务器一致性hash分布算法示例
2018/08/09 PHP
JavaScript中常见陷阱小结
2010/04/27 Javascript
Javascript 面向对象 继承
2010/05/13 Javascript
jQuery EasyUI API 中文文档 - NumberBox数字框
2011/10/13 Javascript
jquery中dom操作和事件的实例学习 仿yahoo邮箱登录框的提示效果
2011/11/30 Javascript
jQuery Validate插件自定义验证规则的方法
2016/12/27 Javascript
基于 Vue.js 之 iView UI 框架非工程化实践记录(推荐)
2017/11/21 Javascript
微信小程序 Storage更新详解
2019/07/16 Javascript
nodejs和react实现即时通讯简易聊天室功能
2019/08/21 NodeJs
vue 开发之路由配置方法详解
2019/12/02 Javascript
vue项目在webpack2实现移动端字体自适配功能
2020/06/02 Javascript
原生JS实现音乐播放器的示例代码
2021/02/25 Javascript
关于numpy中np.nonzero()函数用法的详解
2017/02/07 Python
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
2017/04/11 Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
2017/11/02 Python
Python for循环生成列表的实例
2018/06/15 Python
通过python将大量文件按修改时间分类的方法
2018/10/17 Python
Python循环实现n的全排列功能
2019/09/16 Python
Python如何使用bokeh包和geojson数据绘制地图
2020/03/21 Python
Django Xadmin多对多字段过滤实例
2020/04/07 Python
Python 字典中的所有方法及用法
2020/06/10 Python
掌上明珠Java程序员面试总结
2016/02/23 面试题
奥巴马竞选演讲稿
2014/05/15 职场文书
党员一帮一活动总结
2014/07/08 职场文书
房产授权委托书范本
2014/09/22 职场文书
市级三好学生评语
2014/12/29 职场文书
主持人开场白台词
2015/05/29 职场文书
Python 线程池模块之多线程操作代码
2021/05/20 Python
使用react-virtualized实现图片动态高度长列表的问题
2021/05/28 Javascript
Python实现简繁体转换
2021/06/07 Python
SQL基础的查询语句
2021/11/11 MySQL