TreadingTCPServer
TreadingTCPServer实现的socket服务器内部会为每个client创建一个线程,该线程用来和客户端进行交互。
1、TreadingTCPServer基础
使用TreadingTCPServer:
创建一个继承socketserver.BaseRequestHandler的类
类中必须定义一个名称为handle的方法
启动TreadingTCPServer
import SocketServer
class MyServer(SocketServer.BaseRequestHandler):
def handle(self):
# print self.request,self.client_address,self.server
conn = self.request
conn.sendall('欢迎致电 10086,请输入1xxx,0转人工服务.')
Flag = True
while Flag:
data = conn.recv(1024)
if data == 'exit':
Flag = False
elif data == '':
conn.sendall('通过可能会被录音.balabala一大推')
else:
conn.sendall('请重新输入.')
if __name__ == '__main__':
server = SocketServer.ThreadingTCPServer(('127.0.0.1',8009),MyServer)
server.serve_forever()
import socket
ip_port = ('127.0.0.1',8009)
sk = socket.socket()
sk.connect(ip_port)
sk.settimeout(5)
while True:
data = sk.recv(1024)
print 'receive:',data
inp = raw_input('please input:')
sk.sendall(inp)
if inp == 'exit':
break
sk.close()
2、TreadingTCPServer源码剖析
TreadingTCPServer的类图关系如下:

内部调用流程为:
1、启动服务端程序
2、执行TCPServer.__init__方法,创建服务端socket对象并绑定IP和端口
3、执行BaseServer.__init__方法,将自定义的继承自socketserver.BaseRequestHandler的类赋值给self.RequestHandlerClass
4、执行BaseServer.server_forever方法,while循环一直监听是否有客户端请求到达
5、当客户端链接到达服务器
6、执行ThreadingMixIn.process_request方法,创建一个线程用来处理请求
7、执行TreadingMixIn.process_request_thread方法
8、执行BaseServer.finish_request方法,执行self.RequestHandleClass(),即:执行自定义MyRequestHandle的构造方法(自动调用基类BaseRequestHandler的构造方法,在该构造方法中会调用MyRequestHandler的handle方法)
源码精简:
import socket
import threading
import select def process(request, client_address):
print request,client_address
conn = request
conn.sendall('欢迎致电 10086,请输入1xxx,0转人工服务.')
flag = True
while flag:
data = conn.recv(1024)
if data == 'exit':
flag = False
elif data == '':
conn.sendall('通过可能会被录音.balabala一大推')
else:
conn.sendall('请重新输入.') sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sk.bind(('127.0.0.1',8002))
sk.listen(5) while True:
r, w, e = select.select([sk,],[],[],1)
print 'looping'
if sk in r:
print 'get request'
request, client_address = sk.accept()
t = threading.Thread(target=process, args=(request, client_address))
t.daemon = False
t.start() sk.close()
从精简代码可以看出,socketserver的TreadingTCPServer之所以可以同时处理请求得益于select和Treading两个东西,其实本质上就是在服务器端为每个客户端创建一个线程,当前线程用来处理对应客户端的请求,所以,可以支持同事n个客户端链接(长连接)。
TreadingTCPServer的更多相关文章
- 网络编程之套接字socket
目录 socket套接字 引子 为何学习socket一定要先学习互联网协议 socket是什么 套接字类型 基于文件类型的套接字家族 基于网络类型的套接字家族 套接字工作流程 基于TCP的套接字 简单 ...
随机推荐
- JDK1.7新特性(2):异常和可变长参数处理
异常 jdk1.7对try--catch--finally的异常处理模式进行了增强,下面我们依次来看增强的方面. 1. 为了防止异常覆盖,给Throwable类增加了addSuppressed方法,可 ...
- java类加载机制及方法调用
类加载机制 概述 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading).验证(Verification).准备(Preparation).解析(Resoluti ...
- linux的环境变量与文件查找
1. 环境变量 1.1 变量 shell 中的变量有不同类型,可参与运算,有作用域限定 变量的作用域即变量的有效范围(比如一个函数中.一个源文件中或者全局范围),在该范围内只能有一个同名变量.一旦离开 ...
- poj 1811 Prime Test 大数素数测试+大数因子分解
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 27129 Accepted: 6713 Case ...
- HDU 2199 (二分法)
主要思想就是两端逼近,最后得到结果,0MS #include <iostream> #include <cstdlib> #include <cstdio> #in ...
- EF框架CodeFirst the model backing the 'PModelEntities' context has changed since the database was created. Consider using Code First Migrations to update the database
1.采用code first 做项目时,数据库已经生成,后期修改数据库表结构.再次运行时出现一下问题: Entity Framework : The model backing the 'Produc ...
- MVC 导出Execl 的总结几种方式 (一)
在ASP.NET 中导出Execl 表格有很多方式,有利有弊,就是看自己怎么使用了:下面就是自己总结了几种导出Execl 方式的,仅供参考. 导出Execl 的原理都是一样的,其实都是将数据整合成ta ...
- css属性之float
0.float与margin 两个相邻的浮动元素,当第一个浮动元素(不论是左浮动还是右浮动)的宽度为100%时,第二个浮动元素会被挤到下面,通过添加负margin-right值(绝对值最少等于它自身的 ...
- 解决chrome提示您的连接不是私密连接的方法
升级到最新的chrome , 开始报开发环境的证书错误问题 升级前,至少还有个可以添加例外,这个挺爽, 都不给设置. 网上找了找,有个解决方式 将选项卡切换至“快捷方式”栏,在目标的最 ...
- Codeforces Round #417 B. Sagheer, the Hausmeister
B. Sagheer, the Hausmeister time limit per test 1 second memory limit per test 256 megabytes Som ...