Python的SocketServer中的類ThreadingTCPServer/TCPServer/ForkingTCPServer區別
阿新 • • 發佈:2019-02-15
本文主要講解ThreadingTCPServer/TCPServer/ForkingTCPServer的區別,原理可同樣引申到UDP
這三個類其實就是對接收到request請求後的不同處理方法。
TCPServer是接收到請求後執行handle方法,如果前一個的handle沒有結束,那麼其他的請求將不會受理,新的客戶端也無法加入。
而ThreadingTCPServer和ForkingTCPServer則允許前一連線的handle未結束也可受理新的請求和連線新的客戶端,區別在於前者用建立新執行緒的方法執行handle,後者用新程序的方法執行handle
這裡給出兩個程式用於測試,幫助瞭解
server部分
# coding=utf-8 import SocketServer import time class WebSocketServer(SocketServer.StreamRequestHandler): def handle(self): print "run" print self.client_address data = self.rfile.readline() self.wfile.write('%s %s'%(time.ctime(),data)) print data # 阻止handle退出 便於分析區別 while True: pass if __name__ == "__main__" : # 可以簡單將下述ThreadingTCPServer替換為TCPServer wsServer = SocketServer.ThreadingTCPServer(( 'localhost',9600),WebSocketServer) print "run" wsServer.serve_forever()
client部分
import socket HOST = 'localhost' PORT = 9600 BUFSIZ = 102400 ADDR = (HOST, PORT) tcpCliSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcpCliSock.connect(ADDR) while True: data = raw_input('> ') if not data: break tcpCliSock.send("%s\r\n"%data) data = tcpCliSock.recv(BUFSIZ) if not data: break print data.strip()
測試方法,先執行server程式碼,然後執行client程式碼,然後從client輸入一個字串,看看兩個視窗的輸出,然後不要關掉這個client,而是再執行一個新的client同樣輸入一個字串觀察輸出。
然後,你可以將server部分的ThreadingTCPServer替換為TCPServer,再重複上述步驟,對比兩次執行的區別