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 多线程Threading初学教程
Aug 22 Python
深入理解Django的自定义过滤器
Oct 17 Python
一文总结学习Python的14张思维导图
Oct 17 Python
浅谈Python中带_的变量或函数命名
Dec 04 Python
python如何去除字符串中不想要的字符
Jul 05 Python
在python中pandas的series合并方法
Nov 12 Python
详解Python3之数据指纹MD5校验与对比
Jun 11 Python
借助Paramiko通过Python实现linux远程登陆及sftp的操作
Mar 16 Python
Python telnet登陆功能实现代码
Apr 16 Python
python代码实现将列表中重复元素之间的内容全部滤除
May 22 Python
Python环境搭建过程从安装到Hello World
Feb 05 Python
Python图像处理库PIL详细使用说明
Apr 06 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
使用无限生命期Session的方法
2006/10/09 PHP
PHP中MD5函数使用实例代码
2008/06/07 PHP
PHP字符串长度计算 - strlen()函数使用介绍
2013/10/15 PHP
php调用shell的方法
2014/11/05 PHP
深入理解PHP变量的值类型和引用类型
2015/10/21 PHP
PHP中call_user_func_array回调函数的用法示例
2016/11/26 PHP
jquery的attr方法禁用表单元素禁用输入内容
2014/06/23 Javascript
关于javascript模块加载技术的一些思考
2014/11/28 Javascript
node.js中的buffer.Buffer.isBuffer方法使用说明
2014/12/14 Javascript
JavaScript将XML转成JSON的方法
2015/03/12 Javascript
JS弹出层遮罩,隐藏背景页面滚动条细节优化分析
2016/04/29 Javascript
jQuery基于toggle实现click触发DIV的显示与隐藏问题分析
2016/06/12 Javascript
JS实现兼容火狐及IE iframe onload属性的遮罩层隐藏及显示效果
2016/08/23 Javascript
利用策略模式与装饰模式扩展JavaScript表单验证功能
2017/02/14 Javascript
JS非空验证及邮箱验证的实例
2017/08/11 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
Vue项目结合Vue-layer实现弹框式编辑功能(实例代码)
2020/03/11 Javascript
jquery css实现流程进度条
2020/03/26 jQuery
解决父组件将子组件作为弹窗调用只执行一次created的问题
2020/07/24 Javascript
python实现从字典中删除元素的方法
2015/05/04 Python
如何用python整理附件
2018/05/13 Python
python把数组中的数字每行打印3个并保存在文档中的方法
2018/07/17 Python
django连接oracle时setting 配置方法
2019/08/29 Python
Python 文件操作之读取文件(read),文件指针与写入文件(write),文件打开方式示例
2019/09/29 Python
加拿大廉价机票预订网站:CheapOair.ca
2018/03/04 全球购物
幼师求职自荐信范文
2014/01/26 职场文书
暑期社会实践感言
2014/02/25 职场文书
借款协议书
2014/04/12 职场文书
团结就是力量演讲稿
2014/05/21 职场文书
计算机应用专业毕业生求职信
2014/06/03 职场文书
法人任命书范本
2014/06/04 职场文书
幼儿园安全责任书范本
2014/07/24 职场文书
国庆节演讲稿范文2014
2014/09/19 职场文书
工伤事故赔偿协议书范文
2014/09/24 职场文书
MySQL命令行操作时的编码问题详解
2021/04/14 MySQL
Redis基本数据类型List常用操作命令
2022/06/01 Redis