利用Python的SocketServer框架编写网络服务程序

1.前言:

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

2.网络服务类:

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

TCPServer针对TCP套接字流

立即学习“Python免费学习笔记(深入)”;

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 ',addrself.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 ',addrself.wfile.write('Thank you for connection')server = Server(('', 1234), Handler)#实例化服务类server.serve_forever()#开启服务

登录后复制

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2283629.html

(0)
上一篇 2025年2月27日 20:16:15
下一篇 2025年2月19日 02:49:24

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • python数据类型转换

    python类型转换 函数                      描述   int(x [,base ])         将x转换为一个整数   long(x [,base ])        将x转换为一个长整数   float(x…

    编程技术 2025年2月27日
    200
  • Python的字符串索引和分片

    1.字符串的索引 给出一个字符串,可输出任意一个字符,如果索引为负数,就是相当于从后向前数。 >>> str=”HelloWorld!” >>> print str[0] H 立即…

    编程技术 2025年2月27日
    200
  • python None与Null 的区别

    一、python对象 要理解这个,首先要理解Python对象: python对象具有三个特性:身份、类型、值。 三特性在对象创建时被赋值。只有值可以改变,其他只读。 类型本身也是对象。 立即学习“Python免费学习笔记(深入)”; 二、N…

    编程技术 2025年2月27日
    200
  • Python2和Python3的10大区别

    1.性能 Py3.0运行pystone benchmark的速度比Py2.5慢30%。Guido认为Py3.0有极大的优化空间,在字符串和整形操作上可以取得很好的优化结果。 2.编码 Py3.0源码文件默认使用utf-8编码,这就使得以下代…

    编程技术 2025年2月27日
    200
  • python全局变量

    全局变量不符合参数传递的精神,所以,平时我很少使用,除非定义常量。今天有同事问一个关于全局变量的问题,才发现其中原来还有门道。 程序大致是这样的: CONSTANT = 0def modifyConstant() :        prin…

    编程技术 2025年2月27日
    200
  • python 图 自身遍历及弱引用使用

    在【python 标准库】中看到的一段代码,非常有帮助: def all_nodes(self):        yield self        n = self.other        while n and n.name != s…

    编程技术 2025年2月27日
    200
  • python图像文字识别

    最近在想没有一个图片文字识别的工具呢?我想到了ocr,国内比较牛逼的汉王ocr。那借助python能否实现呢?于是我找啊找查啊查有关python在这方面探讨的资料,发现pytesser 这样一个好玩的程序!拿出来分享讨论一下: PyTess…

    编程技术 2025年2月27日
    200
  • 深入理解python函数传参机制

    首先需要申明的一点是,python里是没有像c和c++里那样按值传参的说法的。python中的所有东西都是对象,这也是它的强大之处,它没有基本类型之说。 在python中,类型属于对象,变量是没有类型的,这正是python的语言特性,也是吸…

    编程技术 2025年2月27日
    200
  • Python命名空间实例解析

    python的命名空间是python程序猿必须了解的内容,对python命名空间的学习,将使我们在本质上掌握一些python中的琐碎的规则。 接下来我将分四部分揭示Python命名空间的本质:一、命名空间的定义;二、命名空间的查找顺序;三、…

    编程技术 2025年2月27日
    200
  • python魔术方法详解

    准备工作 为了确保类是新型类,应该把 _metaclass_=type 入到你的模块的最开始。 class NewType(Object):  mor_code_hereclass OldType:  mor_code_here 登录后复制…

    编程技术 2025年2月27日
    200

发表回复

登录后才能评论