1. 程式人生 > >Python的SocketServer中的類ThreadingTCPServer/TCPServer/ForkingTCPServer區別

Python的SocketServer中的類ThreadingTCPServer/TCPServer/ForkingTCPServer區別

本文主要講解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,再重複上述步驟,對比兩次執行的區別