1. 程式人生 > >Socketserver的運用(一)

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