`
- 浏览:
154752 次
- 性别:
- 来自:
深圳
-
使用SocketServers
SocketServers模块为一组socket服务类定义了一个基类,这组类压缩和隐藏了监听、接受和处理进入的socket连接的细节。
1、SocketServers家族
TCPServer和UDPServer都是SocketServer的子类,它们分别处理TCP和UDP信息。
注意:SocketServer也提供UnixStreamServer(TCPServer的子类)和UNIXdatagramServer(UDPServer的子类),它们都如同其父类一样除了在创建监听socket时使用AF_UNIX代替了AF_INET。
默认情况下,socket服务一次处理一个连接,但是你可以使用ThreadingMixIN和ForkingMixIn类来创建任一SocketServer的线程和子进程。实际上,SocketServer模块提供了一些对些有用的类来解决你的麻烦,它们是:ForkingUDPServer、ForkingTCPServer、ThreadingUDPServer、ThreadingTCPServer、ThreadingUnixStreamServer和ThreadingUnixDatagramServer。
SocketServer以通常的方法处理进入的连接;要使它更有用,你应该提供你自己的请求处理器类给它以便它传递一个socket去处理。SocketServer模块中的BaseRequestHandler类是所有请求处理器的父类。假设,例如你需要写一个多线程的电子邮件服务器,首先你要创建一个MailRequestHandler,它是BaseRequestHandler的子类,然后把它传递给一个新创建的SocketServer:
import SocketServer
...#创建你的MailRequestHandler
addr=('220.172.20.6',25) #监听的地址和端口
server=SocketServer.ThreadingTCPServer(addr,MailRequestHandler)
server.serve_forever()
每次一个新的连接到来时,这个server创建一个新的MailRequestHandler实例并调用它的handle()方法来处理这个新的请求。因为server继承自ThreadingTCPServer,对于每个新的请求它都启动一个单独的线程来处理这个请求,以便于多个请求能够被同时处理。如果用handle_request()代替server_forever,它将一个一个的处理连接请求。server_forever 只是反复调用handle_request而已。
一般来说,你只需使用socket服务之一,但是如果你需要创建你自己的子类的话,你可以覆盖我们下面提到的方法来定制它。
当服务被第一次创建的时候,__init__函数调用server_bind()方法来绑定监听socket(self.socket)到正确的地址(self.server_address)。然后调用server_activate()来激活这个服务(默认情况下,调用socket的listen方法)。
这个socket服务不做任何事情直到调用了handle_request或serve_forever方法。handle_request调用get_request()去等待和接收一个新的socket连接,然后调用verify_request(request,client_address)去看服务是否会处理这个连接(你可以在访问控制中使用这个,默认情况下verify_request总是返回true)。如果会处理这个请求,handle_request然后调用process_request(request,client_address),如果process_request(request,client_address)导致一个异常的话,将调用handle_error(request,client_address)。默认情况下,process_request简单地调用finish_request(request,client_address);子进程和线程类覆盖了这个行为去开始一新的进程或线程,然后调用finish_request。finish_request实例化一个新的请求处理器,请求处理器轮流调用它们的handle()方法。
当SocketServer创建一个新的请求处理器时,它传递给这个处理器的__init__函数的self变量,以便于这个处理器能够访问关于这个服务的信息。
SocketServer的fileno()方法返回监听socket的文件描述符。address_family成员变量指定了监听socket的socket族(如AF_INET),server_address包含了监听socket被绑定到的地址。socket变量包含监听socket自身。
2、请求处理器
请求处理器有setup()、handle()和finish()方法,你可以覆盖它们来定制你自己的行为。一般情况下,你只需要覆盖handle方法。BaseRequestHandler的__init__函数调用setup()方法来做初始化的工作,handle()服务于请求,finish()用于执行清理工作,如果handle或setup导致一个异常,finish不会被调用。记住,你的请求处理器会为每个请求创建一个新的实例。
request成员变量有关于流(TCP)服务的最近接受的socket;对于数据报服务,它是一个包含进入消息和监听socket的元组。client_address包含发送者的地址,server有对SocketServer的一个引用(通过这你可以访问它的成员,如server_address)。
下面的例子实现了一个EchoRequestHandler,这作为一个服务端它将客户端所发送的数据再发送回客户端:
>>> import SocketServer
>>> class EchoRequestHandler(SocketServer.BaseRequestHandler):
... def handle(self):
... print 'Got new connection!'
... while 1:
... mesg=self.request.recv(1024)
... if not msg:
... break
... print 'Received:',msg
... self.request.send(msg)
... print 'Done with connection'
>>> server=SocketServer.ThreadingTCPServer(('127.0.0.1',12321),EchoReuestHandler)
>>> server.handle_request() #执行后将等待连接
Got new connection!
Received: Hello!
Received: I like Tuesdays!
Done with connection
打开另一个Python解释器作为客户端,然后执行如下代码:
>>> from socket import *
>>> s=socket(AF_INET,SOCK_STREAM)
>>> s.connect(('120.0.0.1',12321))
>>> s.send('Hello!')
6
>>> print s.recv(1024)
Hello!
>>> s.send('I like Tuesdays!')
16
>>> print s.recv(1024)
I like Tuesdays!
>>> s.close()
SocketServer模块也定义了BaseRequestHandler的两个子类:StreamRequestHandler和DatagramRequestHandler。它们覆盖了setup和finish方法并创建了两个文件对象rfile和wfile,你可以用这两个文件对象来向客户端读写数据,从而代替使用socket方法。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
PYTHON网络编程基础.pdfPYTHON网络编程基础.pdfPYTHON网络编程基础.pdfPYTHON网络编程基础.pdfPYTHON网络编程基础.pdfPYTHON网络编程基础.pdfPYTHON网络编程基础.pdf
本书全面的介绍了python语言进行网络编程的基础,主要内容包括网络基础知识,网络操作,高级网络操作等
Python网络编程.pdfPython网络编程.pdfPython网络编程.pdfPython网络编程.pdfPython网络编程.pdfPython网络编程.pdfPython网络编程.pdfPython网络编程.pdf
Python是一种功能十分强大的面向对象编程语言,可以用于编写独立程序、快速脚本和复杂应用的原型。作为一种开源软件,Python可以自由获取,而且非常易学易用。本书是Python语言的经典入门读本,由两名顶尖的Python...
PYTHON网络编程基础.pdf PYTHON网络编程基础.pdf PYTHON网络编程基础.pdf
python网络编程第3版 英文 python3
python网络编程,适用于网络编程方向的同学,书中采用的是python3的代码。
Python网络编程视频讲解3 ICMP UDP.avi Python网络编程视频讲解10.phon实战avi Python网络编程视频讲解9数据库mp4 Python网络编程视频讲解8Na Python网络编程视频讲解5 SNMP Syslog NTP.avi Python网络编程视频拼解2...
python网络编程
python 网络编程和网络编程基础
Python网络编程基础
python网络编程小例子
python基于Linux平台网络编程的PPT与源代码
Python网络编程视频讲解1.ARP.avi Python网络编程视频讲解2.ARP IP ICMP.avi Python网络编程视频讲解3.ICMP UDP.avi Python网络编程视频讲解4 DNS DHCP TFTP.avi Python网络编程视频讲解5.SNMP Syslog NTP.avi ...
非常全面的Python网络编程教程,详细讲解了用Python进行网络编程的方方面面
Python 网络编程 python网络编程 socket