操作Python的SocketServer框架编写网络处事措施
1.媒介:
虽说用Python编写简朴的网络措施很利便,但巨大一点的网络措施照旧用现成的框架较量好。这样就可以专苦衷务逻辑,而不是套接字的各类细节。SocketServer模块简化了编写网络处事措施的任务。同时SocketServer模块也是Python尺度库中许多处事器框架的基本。
2.网络处事类:
SocketServer提供了4个根基的处事类:
TCPServer针对TCP套接字流
UDPServer针对UDP数据报套接字
UnixStreamServer和UnixDatagramServer针对UNIX域套接字,不常用。
它们的担任干系如下:
+————+
| BaseServer |
+————+
|
v
+———–+ +——————+
| TCPServer |——->| UnixStreamServer |
+———–+ +——————+
|
v
+———–+ +——————–+
| UDPServer |——->| UnixDatagramServer |
+———–+ +——————–+
2.1异步处理惩罚:
这个四个处事类都是同步处理惩罚请求的。一个请求没处理惩罚完不能处理惩罚下一个请求。要想支持异步模子,可以操作多担任让server类担任ForkingMixIn 或 ThreadingMixIn mix-in classes。
ForkingMixIn操作多历程(分叉)实现异步。
ThreadingMixIn操作多线程实现异步。
3.请求处理惩罚类:
要实现一项处事,还必需派生一个handler class请求处理惩罚类,并重写父类的handle()要领。handle要领就是用来专门是处理惩罚请求的。该模块是通过处事类和请求处理惩罚类组合来处理惩罚请求的。
SocketServer模块提供的请求处理惩罚类有BaseRequestHandler,以及它的派生类StreamRequestHandler和DatagramRequestHandler。从名字看出可以一个处理惩罚流式套接字,一个处理惩罚数据报套接字。
4.总结用SocketServer建设一个处事的步调:
1.建设一个request handler class(请求处理惩罚类),担任自BaseRequestHandler class并重写它的handle()要领,该要领将处理惩罚到的请求。
2.实例化一个server class工具,并将处事的地点和之前建设的request handler class通报给它。
3.挪用server class工具的handle_request() 或 serve_forever()要领来开始处理惩罚请求。
一个基于SocketServer的处事器示例:
from SocketServer import TCPServer,StreamRequestHandler #界说请求处理惩罚类 class Handler(StreamRequestHandler): def handle(self): addr = self.request.getpeername() print 'Got connection from ',addr self.wfile.write('Thank you for connecting') server = TCPServer(('',1234), handler)#实例化处事类工具 server.server_forever()#开启处事
5.实现异步,支持多毗连
前面先容处事类时提到过,四个根基的处事类默认是同步模子的。要想支持异步可以操作多担任从ForkingMixIn 或ThreadingMixInmix-in classes和一个根基的处事类担任来界说一个支持异步的处事类。好比:
class Server(ThreadingMixIn, TCPServer): pass
ForkingMixIn 要思量历程间的通信。ThreadingMixIn要思量线程会见同一变量时的同步和互斥。
一个利用了多线程处理惩罚的处事器示例:
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('Thank you for connection') server = Server(('', 1234), Handler)#实例化处事类 server.serve_forever()#开启处事