Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4584592
  • 博文数量: 1214
  • 博客积分: 13195
  • 博客等级: 上将
  • 技术积分: 9105
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-19 14:41
个人简介

C++,python,热爱算法和机器学习

文章分类

全部博文(1214)

文章存档

2021年(13)

2020年(49)

2019年(14)

2018年(27)

2017年(69)

2016年(100)

2015年(106)

2014年(240)

2013年(5)

2012年(193)

2011年(155)

2010年(93)

2009年(62)

2008年(51)

2007年(37)

分类: Python/Ruby

2014-01-16 15:55:33

文章来源:http://blog.csdn.net/candcplusplus/article/details/9166255

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的服务器示例:

  1. from SocketServer import TCPServer,StreamRequestHandler  
  2. #定义请求处理类  
  3. class Handler(StreamRequestHandler):  
  4.   
  5.     def handle(self):  
  6.         addr = self.request.getpeername()  
  7.         print 'Got connection from ',addr  
  8.         self.wfile.write('Thank you for connecting')  
  9.   
  10. server = TCPServer(('',1234), handler)  #实例化服务类对象  
  11.   
  12. server.server_forever() #开启服务  


 

 

5.实现异步,支持多连接

        前面介绍服务类时提到过,四个基本的服务类默认是同步模型的。要想支持异步可以利用多继承从ForkingMixInThreadingMixInmix-in classes和一个基本的服务类继承来定义一个支持异步的服务类。比如:

class Server(ThreadingMixIn, TCPServer): pass

        

         ForkingMixIn 要考虑进程间的通信。ThreadingMixIn要考虑线程访问同一变量时的同步和互斥。

 

 一个使用了多线程处理的服务器示例:

  1. from SocketServer import TCPServer, ThreadingMixIn, StreamRequestHandler  
  2.   
  3. #定义支持多线程的服务类,注意是多继承  
  4. class Server(ThreadingMixIn, TCPServer): pass  
  5.   
  6. #定义请求处理类  
  7. class Handler(StreamRequestHandler):  
  8.       
  9.     def handle(self):  
  10.         addr = self.request.getpeername()  
  11.         print 'Got connection from ',addr  
  12.         self.wfile.write('Thank you for connection')  
  13.   
  14. server = Server(('', 1234), Handler)    #实例化服务类  
  15. server.serve_forever()  #开启服务  


 

 

6.参考:

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

Python在线文档

阅读(1326) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~