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