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的套接字 简单 ...
随机推荐
- Golang Socket编程
Socket编程 在很多底层网络应用开发者的眼里一切编程都是Socket,话虽然有点夸张,但却也几乎如此了,现在的网络编程几乎都是用Socket来编程.你想过这些情景么?我们每天打开浏览器浏览网页时, ...
- iOS傻金币动画
项目要做一个撒金币签到的动画,分享出来 金币.zip,其中有几个做的时候注意的点. 1.金币掉入口袋的过程,有入口袋的效果. 开始做的时候直接把金币添加到底部的View上这样入口袋的时候,口袋里边显示 ...
- echarts实现自动轮播tooltip
最近需要实现echarts图形中hover效果轮播(即tooltip在各个数据点上轮流显示)的功能,以下就是我学习的一个过程,只是提供思路,具体场景需要自己修改.(仅针对echarts 2.2.7及以 ...
- 使用FileSystemWatcher监视指定目录
使用 FileSystemWatcher 监视指定目录中的更改.可监视指定目录中的文件或子目录的更改. 以下是一个简单的实例,用来监控指定目录下文件的新增.删除.重命名等情况(文件内容更改会触发多次, ...
- 实例-PHP_SELF、 SCRIPT_NAME、 REQUEST_URI区别-获取前台公用文-dirname-PHP的"魔术常量"-str_replace
Part1:实例 $_SERVER[PHP_SELF], $_SERVER[SCRIPT_NAME], $_SERVER['REQUEST_URI'] 在用法上是非常相似的,他们返回的都是与当前正在使 ...
- Zookeeper配置要点必看
注意点 zookeeper需要在各个节点的机器上搭建,它的启动也要在各个节点的$ZOOKEEPER_HOME/bin 下启动. 环境搭建 下载安装包并解压. 在$ZOOKEEPER_HOME/conf ...
- Spring 中的Enum HttpStatus 及HTTP状态码
官方API https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/HttpStatus.htm ...
- csu 1365 双向链表模拟超时
1365: Play with Chain Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 21 Solved: 5[Submit][Status][W ...
- log4j2配置文件
项目里面经常用到日志,Java开发一般用log4j.slf4j这些框架,看着配置文件有点懵.这几天看公司代码的时候,也有用到log4j,感觉要复杂一点.在本地打log,也有打到hive里面存的.看了一 ...
- Vue指令的钩子函数使用方法
在Vue 中可以把一系列复杂的操作包装为一个指令. 什么是复杂的操作? 我的理解是:复杂逻辑功能的包装.违背数据驱动的 DOM 操作以及对一些 Hack 手段的掩盖等.我们总是期望以操作数据的形式来实 ...