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的套接字 简单 ...
随机推荐
- [PY3]——字符串的分割、匹配、搜索方法总结
?分割.匹配.搜索时可以用到什么样的解决方法? 分割方法总结 1. str.split( ) * 分割字符串 * 返回列表 s1='I love python' # 默认以空格为界定符,且多个空格都当 ...
- 布局xml里面所有元素详解
被坑惨了,为了去掉一个元素,被各种莫名其妙的问题坑惨了.把所有常用到的都记录下来,不要再被坑到了 tools:context:http://blog.csdn.net/xiabing082/artic ...
- 写Markdown费事?Typora让你像写word一样行云流水,所见即所得。
Typora 简介 Typora删除了预览窗口,以及所有其他不必要的干扰.取而代之的是实时预览. Markdown的语法因不同的解析器或编辑器而异,Typora使用的是GitHub Flavored ...
- SQL 之获取DATE类的年月日语句
Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM Select CONVERT(varchar(100), GETDATE( ...
- C#读取MySql表字段出现System.Byte[]问题
记录下,用了多字段拼接后在程序中查询出的结果为System.Byte[],而在数据库中查正常 解决办法为:加Convert转换编码 select CONVERT((CASE background ...
- 面向对象(基础oop)之初识继承
大家好,我叫李京阳,,很高兴认识大家,之所以我想开一个自己的博客,就是来把自己所了解的知识点通过自己的话写一下,希望被博客园的朋友们点评和一起讨论一下,也希望从博客园中多认识一些软件开发人员!现在我开 ...
- SecureCRT远程连接Linux下的sqlplus中退格键不能使用之解决方法
^H不是H键的意思,是backspace 主要是当你的终端backspace有问题的时候才需要设置 在linux环境下使用sqlplus,在回删(backspace)时往往会出现 一串的乱码.出现 ...
- R 语言—基本绘图
https://www.harding.edu/fmccown/r/ 这个网站上有壮观的 R 绘制的实际图形 下面只记录自己感兴趣的内容 单变量绘图下包含 1. 带状图 2. 茎叶图 3. 直方图 ...
- K:大数加法
相关介绍: 在java中,整数是有最大上限的.所谓大数是指超过整数最大上限的数,例如18 452 543 389 943 209 789 324 233和8 123 534 323 432 323 ...
- IDEA使用maven建web项目示例
运行环境:OSX-10.13.3. IDEA-2017.3.3. maven-3.5.2 步骤1:选择maven-webapp模板新建web项目 步骤2:设置项目GroupId等 需从网上下载相关构件 ...