socketserver(在Python2.*中的是SocketServer模块)是标准库中一个高级别的模块。用于简化网络客户与服务器的实现(在前面使用socket的过程中,我们先设置了socket的类型,然后依次调用bind(),listen(),accept(),最后使用while循环来让服务器不断的接受请求。而这些步骤可以通过SocketServer包来简化。)。模块中,已经实现了一些可供使用的类。
我们将再次实现之前的那个基本TCP的例子。你会注意到新实现与之前有很多相似之处,但你也要注意到,现在很多繁杂的事情已经被封装好了,你不用再去关心那个样板代码了。例子给出的是一个最简单的同步服务器。
为了要隐藏实现的细节。我们现在写程序时会使用类,这是与之前代码的另一个不同。用面向对象的方法可以帮助我们更好的组织数据与逻辑功能。你也会注意到,我们的程序现在是“事件驱动”了。这就意味着,只有在事件出现的时候,程序才有“反应”。
在之前的服务循环中,我们阻塞等待请求,有请求来的时候就处理请求,然后再回去继续等待。现在的服务循环中,就不用在服务器里写代码了,改成定义一个处理器,服务器在收到进来的请求的时候,可以调用你的处理函数。
类 描述
from socketserver import (TCPServer as TCP, StreamRequestHandler as SRH) #可以通过as起别名 from time import ctime HOST = '' PORT = 1234 ADDR = (HOST, PORT) class MyRequestHandler(SRH): def handle(self): print ('已经连接:', self.client_address) self.wfile.write(('[%s] %s' % (ctime(), self.rfile.readline().decode("UTF-8"))).encode("UTF-8")) tcpServ = TCP(ADDR, MyRequestHandler) print ('等待新的连接。。。。') tcpServ.serve_forever()我们从socketserver的StreamRequestHandler类中派生出一个子类,并重写handle()函数。在BaseRequest 类中,这个函数什么也不做。在有客户消息进来的时候,handle()函数就会被调用。StreamRequestHandler 类支持像操作文件对象那样操作输入输出套接字。我们可以用readline()函数得到客户消息,用write()函数把字符串发给客户。
#coding=UTF-8 from socket import * import sys reload (sys) sys.setdefaultencoding('utf8') HOST = '192.168.1.27' PORT = 1234 BUFSIZE = 1024 ADDR = (HOST, PORT) while True: tcpCliSock = socket(AF_INET, SOCK_STREAM) tcpCliSock.connect(ADDR) data = raw_input('>') if not data: break tcpCliSock.send('%s\r\n' % data.encode("UTF-8")) data = tcpCliSock.recv(BUFSIZE).decode("UTF-8") if not data: break print (data.strip()) tcpCliSock.close()
from socketserver import (TCPServer as TCP, StreamRequestHandler as SRH,ForkingMixIn as FMI) #变动位置 from time import ctime HOST = '' PORT = 1234 ADDR = (HOST, PORT) class Server(FMI, TCP): #变动位置 pass class MyRequestHandler(SRH): def handle(self): print ('已经连接:', self.client_address) self.wfile.write(('[%s] %s' % (ctime(), self.rfile.readline().decode("UTF-8"))).encode("UTF-8")) tcpServ = Server(ADDR, MyRequestHandler) #变动位置 print ('等待新的连接。。。。') tcpServ.serve_forever()
from socketserver import (TCPServer as TCP, StreamRequestHandler as SRH,ThreadingMixIn as TMI) #变动位置 from time import ctime HOST = '' PORT = 1234 ADDR = (HOST, PORT) class Server(TMI, TCP): #变动位置 pass class MyRequestHandler(SRH): def handle(self): print ('已经连接:', self.client_address) self.wfile.write(('[%s] %s' % (ctime(), self.rfile.readline().decode("UTF-8"))).encode("UTF-8")) tcpServ = Server(ADDR, MyRequestHandler) #变动位置 print ('等待新的连接。。。。') tcpServ.serve_forever()
上一讲:Python网络编程02----基于UDP的Python简易服务器
下一讲:
Python网络编程03----Python3.*中socketserver
原文地址:http://blog.csdn.net/a359680405/article/details/42589423