在上一篇文章中,我介紹了一下python3 socket編程的基礎,包括TCP、UDP客戶端和伺服器的建立過程(連結在最下方)。不過那個只是單線程的,伺服器一次只能和一個客戶端會話,多個客戶端的話只能等待。我們平時的應用中,伺服器肯定是要並發的,所以,今天將介紹socket編程的多線程編程。一個伺服器同時和多個客戶端建立會話。
多線程原理:TCP伺服器會創建一個線程池,每當有客戶端請求連接的時候,它便會從線程池中分配一個線程同客戶端建立連接,當客戶端中斷連接後,線程便銷毀。
SocketServer 模塊
在python中,socket多線程並發的實現主要是利用SocketServer模塊實現的。客戶端比較簡單,一般只用socket就可以,伺服器端複雜些,用socketserver或者Twisted 框架等,本篇主要講SocketServer。 SocketServer 是標準庫中一個高級別的模塊。用於簡化網絡客戶與伺服器的實現。
socketserver模塊中分兩大類:server類(解決連接問題)和request類(解決通信問題)
server類:
Request類:
類的描述如下:
SocketServerTCP伺服器:
這裡我們用到了類,因為多線程就可以利用面向對象了,每一次連接,不過是實現了一個實例。類我前面也講過了有興趣可以看一下。
在代碼中,先導入我們的伺服器類,然後像之前一樣定義主機常量。主機常量後就是我們的請求處理器類,然後是啟動代碼。
伺服器和客戶端建立連接的步驟我就不寫了,上一篇文章中有。
不廢話了,上代碼:
伺服器端:
代碼解釋:
我們從 SocketServer 的 StreamRequestHandler 類中派生出一個子類,並重寫 handle()函數。
在有客戶消息進來的時候,handle()函數就會被調用。StreamRequestHandler 類支持像操作文件對象那樣操作輸入輸出套接字。用request.recv()函數接收消息。因為socketserver是封裝好的模塊,我們不需要對其初始化連接。其中self.request self.client_address等於socket中 conn,addr = socket.accept(),只不過在socketserver模塊中已經替我們包裝好了,還替我們包裝了包括bind()、listen()、accept()方法(不懂得看我前面文章,連接在下面)。
代碼中間部分就是接收客戶端消息,並返回給客戶端。
代碼的最後部分用給定的主機信息和請求處理類創建 TCP 伺服器。然後進入等待客戶請求與處理客戶請求的無限循環中。
客戶端:
客戶端非常簡單,就是簡單socket編程。代碼和上一篇中的都一樣,就是多了一個異常處理。步驟就是昨天我發的文章裡面的
上一篇文章:Python入門基礎之網絡編程、socket編程、TCP、UDP編程
面向對象:乾貨!Python入門基礎之面向對象二:類和實例、方法
碼字不易,多多關注。