利用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.实现异步,支持多连接

        前面介绍服务类时提到过,四个基本的服务类默认是同步模型的。要想支持异步可以利用多继承从ForkingMixInThreadingMixInmix-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()	#开启服务


 

 

6.参考:

书 《Python基础教程(第2版)》

Python在线文档http://docs.python.org/2/library/socketserver.html



-----------------------------------------------------2016.6.29添加--------------------------------------

分析socketserver源码时很好奇,如果mix-in类和Server中都实现了某个方法,运行时会选择哪个。然后在源码文件中看到了以下说明:

Forking and threading versions of each type of server can be created
using the ForkingMixIn and ThreadingMixIn mix-in classes.  For
instance, a threading UDP server class is created as follows:


        class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass


The Mix-in class must come first, since it overrides a method defined
in UDPServer! Setting the various member variables also changes
the behavior of the underlying server mechanism.


意思是说继承这两个mix-in类时,必须把它放在继承顺序的前面,因为它重写了UDPServer中的同名方法。

Python的`socketserver`模块是用于编写基于网络的服务器应用程序的标准库。它提供了一个高级的服务器框架,使得开发者可以更轻松地创建、处理和管理网络连接。 `socketserver`模块提供了一些类来简化服务器的编写过程。其中最常用的是`socketserver.TCPServer`和`socketserver.UDPServer`类,用于创建TCP和UDP服务器。 下面是一个简单的例子,展示了如何使用`socketserver`模块来创建一个TCP服务器: ```python import socketserver # 创建自定义的请求处理器类 class MyTCPHandler(socketserver.BaseRequestHandler): def handle(self): # 接收客户端请求数据 data = self.request.recv(1024).strip() print(f"Received data from {self.client_address[0]}: {data.decode()}") # 发送响应数据给客户端 response = b"Hello from server!" self.request.sendall(response) # 创建服务器实例,并指定服务器地址和自定义请求处理器类 server = socketserver.TCPServer(("localhost", 8888), MyTCPHandler) # 启动服务器,开始监听客户端连接 server.serve_forever() ``` 在上面的例子中,我们创建了一个自定义的请求处理器类`MyTCPHandler`,继承自`socketserver.BaseRequestHandler`。通过重写`handle()`方法,我们可以处理客户端的请求并返回响应。 然后,我们创建了一个`socketserver.TCPServer`实例,指定服务器地址和自定义请求处理器类。最后,通过调用`serve_forever()`方法,服务器开始监听客户端连接,并在收到请求时调用请求处理器处理请求。 当然,`socketserver`模块还提供了其他一些类和功能,可以根据具体需求进行使用和扩展。希望这能解答你关于`socketserver`的问题!如果有任何进一步的疑问,请随时提问。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值