本文内容参考文章地址:python
https://m.aliyun.com/yunqi/articles/93088/sql
SocketServer是标准库中的一个高级模块(Python 3.x中重命名为socketserver),它的目标是简化不少样板代码,它们是建立网络客户端和服务器所必需的代码。这个模块中有为你建立的各类各样的类,如表2-3所示。编程
除了为你隐藏了实现细节以外,另外一个不一样之处是,咱们如今使用类来编写应用程序。由于以面向对象的方式处理事务有助于组织数据,以及逻辑性地将功能放在正确的地方。你还会注意到,应用程序如今是事件驱动的,这意味着只有在系统中的事件发生时,它们才会工做。浏览器
事件包括消息的发送和接收。事实上,你会看到类定义只包括一个用来接收客户端消息的事件处理程序。全部其余的功能都来自使用的SocketServer类。此外,GUI编程(见第5章)也是事件驱动的。你会当即注意到它们的类似性,由于最后一行代码一般是一个服务器的无限循环,它等待并响应客户端的服务请求。它工做起来几乎与本章前面的基础TCP服务器中的无限while循环同样。服务器
在原始服务器循环中,咱们阻塞等待请求,当接收到请求时就对其提供服务,而后继续等待。在此处的服务器循环中,并不是在服务器中建立代码,而是定义一个处理程序,这样当服务器接收到一个传入的请求时,服务器就能够调用你的函数。网络
首先导入服务器类,而后定义与以前相同的主机常量。其次是请求处理程序类,最后启动它。更多细节请查看下面的代码片断。socket
经过使用SocketServer类、TCPServer和StreamRequestHandler,该脚本建立了一个时间戳TCP服务器。
#!/usr/bin/env python from SocketServer import (TCPServer as TCP, StreamRequestHandler as SRH) from time import ctime HOST='' PORT=21567 ADDR=(HOST, PORT) class MyRequestHandler(SRH): def handle(self): print '...connected from:', self.client_address self.wfile.write('[%s] %s'%(ctime(), self.rfile.readline())) tcpServ=TCP(ADDR, MyRequestHandler) print 'starting arleady!!! waiting for connection... ' tcpServ.serve_forever()
这里面没有写客户端,所以用浏览器访问 本机的 21567 端口。tcp
解释:函数
from SocketServer import (TCPServer as TCP, StreamRequestHandler as SRH)
最初的部分包括从SocketServer导入正确的类。注意,这里使用了Python 2.4中引入的多行导入功能。若是使用的是较早版本的Python,那么将不得不使用彻底限定的module.attribute名称,或者在同一行中导入两个属性。spa
class MyRequestHandler(SRH): def handle(self): print '...connected from:', self.client_address self.wfile.write('[%s] %s'%(ctime(), self.rfile.readline()))
这里进行了大量的工做。咱们获得了请求处理程序MyRequestHandler,做为SocketServer中StreamRequestHandler的一个子类,并重写了它的handle()方法,该方法在基类Request中默认状况下没有任何行为。
def handle(self): pass
当接收到一个来自客户端的消息时,它就会调用handle()方法。而StreamRequestHandler类将输入和输出套接字看做相似文件的对象,所以咱们将使用readline()来获取客户端消息,并利用write()将字符串发送回客户端。
所以,在客户端和服务器代码中,须要额外的回车和换行符。实际上,在代码中你不会看到它,由于咱们只是重用那些来自客户端的符号。除了这些细微的差异以外,它看起来就像之前的服务器。
tcpServ=TCP(ADDR, MyRequestHandler) print 'starting arleady!!! waiting for connection... ' tcpServ.serve_forever()
最后的代码利用给定的主机信息和请求处理类建立了TCP服务器。而后,无限循环地等待并服务于客户端请求。
这里的客户端很天然地很是像最初的客户端,比服务器像得多,但必须稍微调整它以使其与新服务器很好地工做。
SocketServer时间戳TCP客户端(tsTclntSS.py)
这是一个时间戳TCP客户端,它知道如何与相似文件的SocketServer类StreamRequest Handler对象通讯。
#!/usr/bin/env python from socket import * HOST='localhost' PORT=21567 BUFSIZ=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) data=tcpCliSock.recv(BUFSIZ) if not data: break print data.strip() tcpCliSock.close()
SocketServer请求处理程序的默认行为是接受链接、获取请求,而后关闭链接。因为这个缘由,咱们不能在应用程序整个执行过程当中都保持链接,所以每次向服务器发送消息时,都须要建立一个新的套接字。