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 = True
        while flag:
            clientadd = self.client_address
            if clientadd in clientlist :
                pass
            else:
                clientlist.append(clientadd)
                print(str(clientadd)+"已连接")

其实若是我们对BaseRequestHandle进行查看,便可看见:

def setup(self):
    pass

def handle(self):
    pass

def 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-8

from 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 = True
        while flag:
            clientadd = self.client_address
            if clientadd in clientlist :
                pass
            else:
                clientlist.append(clientadd)
                print(str(clientadd)+"已连接")
 
    
if __name__ == '__main__':
    address = ('',23)
    server = Tserver(address,selfRequestHandlerClass)
    server.serve_forever()
    pass


猜你喜欢

转载自blog.csdn.net/nanguodehouzi/article/details/82972775