socketserver模塊


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方法)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM