本文主要是介绍Socketserver的运用(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在TCP通信中,是Client/Server的工作模式,而在这篇文章中,将主要利用python的Socketserver模块去开发一个简单的服务器。
首先,我们要选择好满足自己需求的服务器类型并将需要用到的模块进行import:
from socketserver import ThreadingTCPServer, StreamRequestHandler
from http import client
class Tserver(ThreadingTCPServer): def __init__(self,server_address, selfRequestHandlerClass):ThreadingTCPServer.__init__(self,server_address, selfRequestHandlerClass)
在Socketserver模块中,共包含了六个类,有四个是用于同步模式,它们分别是:TCPServer、UDPServer、UnixStreamServer和
UnixDatagramServer,其中UnixStreamServer和UnixDatagramServer是旨在用于UNIX平台,而另外的ForkingMixIn和ThreadingMixIn则是用于异步模式,并且ForkingMixIn是为每一个客户端请求派生一个新的的进程专门处理,而ThreadingMixIn为每一个客户端请求派生一个新的线程去专门处理。之后我们利用Python的多重继承的特点,可以得出下表:
| TCPServer | UDPServer |
ForkingMixIn | ForkingTCPServer | ForkingUDPServer |
ThreadingMixIn | ThreadingTCPServer | ThreadingUDPServer |
所以我们此次开发的服务器便是——面向TCP连接的线程式异步服务器。
在定义好服务器类型之后,我们需要去定义请求处理器,但在此篇文章中,我们只对ScokerServer提供的BaseRequestHandle中的Setup()进行重载:显示出成功Telnet到所创建服务器的IP地址。
class selfRequestHandlerClass(StreamRequestHandler): def setup(self):clientlist = []flag = Truewhile flag:clientadd = self.client_addressif clientadd in clientlist :passelse:clientlist.append(clientadd)print(str(clientadd)+"已连接")
其实若是我们对BaseRequestHandle进行查看,便可看见:
def setup(self):passdef handle(self):passdef finish(self):pass
这意味初始函数setup()、回调函数handle()与终止化finish()都是虚函数,所以我们可以同时对这三个进行重载。
在重载setup()之后,我们便需要实例化服务器进行测试即可:
if __name__ == '__main__':address = ('',23)server = Tserver(address,selfRequestHandlerClass)server.serve_forever()pass
而在实例化服务器时,传入服务器需要绑定的地址是必要的,另一方面还应该传入已经自定义的Setup(),服务器实例将对每一个客户端连接调用它的Setup()方法,例如:server =ThreadingTCPServer((host, port), MyRequestHandler),而在这里,我们首先定义了一个address,之后server = Tserver(address,selfRequestHandlerClass),并且我们选择的是23号端口,即Telnet端口,同时使用server.serve_forever()多次处理客户端请求。
最后当我们测试代码时,效果如下:
附:
#coding:utf-8from socketserver import ThreadingTCPServer, StreamRequestHandler
from http import client
class Tserver(ThreadingTCPServer): def __init__(self,server_address, selfRequestHandlerClass):ThreadingTCPServer.__init__(self,server_address, selfRequestHandlerClass)
class selfRequestHandlerClass(StreamRequestHandler): def setup(self):clientlist = []flag = Truewhile flag:clientadd = self.client_addressif clientadd in clientlist :passelse:clientlist.append(clientadd)print(str(clientadd)+"已连接")if __name__ == '__main__':address = ('',23)server = Tserver(address,selfRequestHandlerClass)server.serve_forever()pass
这篇关于Socketserver的运用(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!