Python探索之SocketServer詳解

2022-10-04 06:45:10 字數 3763 閱讀 7904

socketserver,網路通訊伺服器,是python標準庫中的乙個模組,其作用是建立網路伺服器。socketserver模組定義了一些類來處理諸如tcp、udp、unix流和unix資料報之上的同步網路請求。

socketserver模組處理網路請求的功能,可以通過兩個主要的類來實現:乙個是伺服器類,乙個是請求處理類。

伺服器類 處理通訊問題,如監聽乙個套接字並接收連線等;

請求處理類 處理「協議」問題,如解釋到來的資料、處理資料並把資料發回給客戶端等。

這種實現將伺服器的實現過程和請求處理的實現過程解耦,這意味著我們可以將不同的伺服器實現和請求處理實現結合起來來處理一些定製的協議,例如乙個tcp伺服器類和乙個流請求處理類結合,處理基於tcp的網路請求。同時,也可以基於socketserver模組中的伺服器類和請求處理類,實現網程式設計客棧絡層之上應用層的伺服器和請求處理實現,例如基於tcp伺服器類實現http伺服器,基於流處理請求類實現http請求處理類等。

伺服器類

socketserver模組中定義了五種伺服器類。

baseserver(伺服器的基類,定義了api)

tcpserver(使用tcp/ip套接字)

udpserver(使用資料報套接字)

unixstreamserver(使用unix域套接字,只適用unix平台)

unixdatagramserver(使用unix域套接字,只適用unix平台)

1. 構造伺服器物件

要構建乙個伺服器物件,需要向它傳遞乙個位址server_address(伺服器將在這個位址上監聽請求),以及乙個請求處理類requesthandlerclass(不是請程式設計客棧求處理例項)。伺服器類基類的建構函式如下:

class baseserver:

def __init__(self, server_address, requesthandlerclass):

"""constructor. may be extended, do not override."""

程式設計客棧 self.server_address = server_address

self.requesthandlerclass = requesthandlerclass

self.__is_shut_down = threading.event()

self.__shutdown_request = false

後,可以構造tcpserver、udpserver、unixstreamserver、unixdatagramserver。其中,tcpserver繼承自baseserver,udpserver和unixstreamserver繼承自tcpserver,unixdatagramserver繼承自udpserver。各個伺服器型別可以根據自己的特點對基類進行擴充套件,例如建立監聽套接字、繫結監聽位址和埠、進行監聽等。一旦例項化伺服器物件,便可以使用伺服器的方法來監聽和處理請求。

2. 實現伺服器

由於socketserver模組中定義的五種伺服器類中,除了基類baseserver和tcpserver外,其餘的三個類都是直接或間接地繼承自tcpserver。因此,以下以tcpserver的實現過程為例進行說明。

構造tcpserver。 構造tcpserver時,建構函式建立了乙個套接字(這個套接字可以通過更改位址簇和型別用於其他伺服器)用於監聽請求。並且呼叫server_bind()繫結監聽的位址和埠,呼叫server_activate()開始監聽。

啟動伺服器。 伺服器例項化後,可以使用serve_forever()或者handle_request()來監聽和處理請求,實現伺服器功能。這兩個方法的具體實現依賴於www.cppcns.com_handle_request_noblock()方法。這個方法是baseserver類中定義的。具體實現如下:

def _handle_request_noblock(self):

"""handle one request, without blocking.

i assume that select.select has returned that the socket is

readable before this function was called, so there should be

no risk of blocking in get_request().

"""try:

request, client_address = self.get_request()

except socket.error:

return

if self.verify_request(request, client_address):

try:

self.process_request(request, client_address)

except:

self.handle_error(request, client_address)

self.shutdown_request(request)

else:

self.shutdown_request(request)

處理請求。 根據上一步驟啟動伺服器後,伺服器便開始監聽請求。如果接收到請求資訊,便開始處理請求。由_handle_request_noblock()可以看出有幾個函式比較重要。

get_request() ——這個函式可以在子類中重寫。在tcpserver中,該函式呼叫監聽套接字的accept()方法,返回請求request和客戶端位址client_address。

verify_request(request, client_address) ——這個函式可以在子類中重寫。該函式返回true表示處理請求,返回false表示忽略請求。

process_request(request, client_address) ——這個函式可以在子類中重寫。該函式將呼叫finish_request()具體完成請求的處理過程,並且在處理完請求後關閉請求。

finish_request(request, client_address) ——該函式將構造乙個請求處理類的例項。請求處理類被例項化後將呼叫其handle()方法處理請求。

3. 程序/執行緒支援

socketserver模組中還提供了一些」mix-in」類:forkingmixin和threadingmixin。這些類可以和伺服器類混合使用,很容易改變伺服器,為每個請求使用乙個單獨的程序或執行緒。具體的伺服器類有:

class forkingudpserver(forkingmixin, udpserver)

class forkingtcpserver(forkingmixin, tcpserver)

class threadingudpserver(threadingmixin, udpserver)

class threadingtcpserver(threadingmixin, tcpserver)

class threadingunixstreamserver(threadingmixin, unixstreamserver)

class threadingunixdatagramserver(threadingmixin, unixdatagramserver)

請求處理類

要接收到來的請求以及確定採取什麼行動,其中大部分的工作都是由請求處理類完成的。請求處理類負責在套接字層之上實現協議。具體過程為:讀取請求、處理請求、寫回響應。請求處理類基類中定義了3個方法,子類中需要重寫。

setup() ——為請求準備請求處理器

handle() ——對請求完成具體的工作。諸如解析到來的請求,處理資料,並發回響應等。

finish() ——清理setup()期間建立的所有資料

總結

Socket原理探索

在使用tcp ip協議族進行網路通訊的過程中,網路層的ip位址可以唯一標識一台網路主機,而傳輸層的協議 埠可以唯一標識主機中的應用程式程序,利用這樣的三元組合 ip位址,協議,埠 就可以在網路中唯一標識網路中的程序,從而為程序在網路中的通訊建立了基石。socket是在應用層和傳輸層之間的乙個抽象層,...

python入門之簡單socket

tcp from socket import host 127.0.0.1 port 12345 addr host,port server socket af inet,sock stream server.bind addr server.listen 5 print start listen....

Python之socket網路程式設計

實現主機間或一台電腦上的程序間進行通訊 例項如下 服務端 匯入socket sys模組 import socket import sys 建立socket物件 serversocket socket.socket socket.af inet,socket.sock stream 獲取本地主機名 h...