1. 程式人生 > >socketserver模塊

socketserver模塊

conn pro raw while 源碼剖析 bytes utf8 main 客戶端

socketserver

socketserver內部使用IO多路復用以及“多線程”和“多進程”,從而實現並發處理多個客戶端請求的scoket服務端。即,每個客戶端請求連接到服務器時,socket服務端都會在服務器是創建一個“線程”或“進程”專門負責處理當前客戶端的所有請求。

ThradingTCPServer

ThradingTCPServer實現的socket服務器內部會為每個client創建一個“線程”,該線程用來heels客戶端進行交互

1,ThradingTCPServer 基礎

使用ThradingTCPServer:

  • 創建一個繼承 socketserver.BaseRequestHandler 的類
  • 類中必須定義一個名we誒handle 的方法
  • 啟動 ThradingTCPServer

代碼:

技術分享
#!/usr/bin/env python3
import socketserver

class Server(socketserver.BaseRequestHandler):    #$ 必須繼承BaseRequestHandler
    def handle(self):        #$ 必須有handle方法
        print(‘New connection:‘,self.client_address)
        while True:
            data = self.request.recv(1024)
            if not data:break    
            print(‘Client data:‘,data.decode())
            self.request.send(data)    

if __name__ == ‘__main__‘:
    server = socketserver.ThreadingTCPServer((‘127.0.0.1‘,8009),MyServer)    #$ 實現多線程的socket
    server.serve_forever()    #$ 當前連接斷開不會出現關閉或報錯,可以與其他客戶端繼續連接
技術分享

client端:

技術分享
import socket
ip_port = (‘127.0.0.1‘,8080)
sk = socket.socket()
sk.connect(ip_port)

while True:
    raw = input(‘>> ‘).strip()
    sk.send(bytes(raw,‘utf8‘))
    msg = sk.recv(1024)
    print(str(msg,‘utf8‘))
sk.close()
技術分享

2,ThradingTCPServer源碼剖析

內部調用流程為:

  • 啟動服務端程序
  • 執行 TCPServer.__init__方法,創建服務端socket對象並綁定IP和端口
  • 執行 BaseServeer.__init__方法,將自定義的繼承自socketserver.BaseRequestHandler 的類 MyRequestHandle賦值給 self.RequestHandlerClass
  • 執行BaseServer.server_forever 方法,while 循環一直監聽是否有客戶端請求到達
  • 當客戶端連接到達服務器
  • 執行ThreadingMixIn.proceess_request 方法,創建一個“線程”用來處理請求
  • 執行 ThreadingMixIn.proceess_request _thread 方法
  • 執行 BaseServer.finish_request 方法,執行 self.RequseetHandlerClass() 即:執行 自定義 MyRequestHandler 的構造方法(自動調用基類 BaseRequestHandler的構造方法,在該構造方法中又會調用MyRequestHandler的handle方法)

socketserver模塊