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

Posted in 未分类

发表评论