首页 > 代码库 > SocketServer-实现并发处理

SocketServer-实现并发处理

Python提供了两个基本的socket模块。

一个是socket,它提供了标准的BSD Socket API;另一个是socketServer,它提供了服务器中心类,可以简化网络服务器的开发。

1.前言:

虽说用Python编写简单的网络程序很方便,但复杂一点的网络程序还是用现成的框架比较好。这样就可以专心事务逻辑,而不是套接字的各种细节。SocketServer模块简化了编写网络服务程序的任务。同时SocketServer模块也是Python标准库中很多服务器框架的基础。

2.网络服务类:

SocketServer提供了4个基本的服务类:

TCPServer针对TCP套接字流

UDPServer针对UDP数据报套接字

UnixStreamServer和UnixDatagramServer针对UNIX域套接字,不常用。

 

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()#开启服务

 

 

 

 

 

 

 

SocketServer-实现并发处理