2011-03-20 29 views

回答

0

在「服務」客戶端的線程中,使用某些在客戶端連接時增加的全局計數,在斷開連接時使用某些全局計數。

如果你想從操作系統層面來算,然後使用nestat -an適當grep過濾器和wc -l(在Windows上使用的grepwc端口)

5

SocketServer.ThreadingTCPServer換一個新的線程爲每個客戶端連接,以便知道多少在連接某一時刻客戶是一樣的知道有多少線程在那一刻還活着,所以只需使用threading.activeCount和客戶的數量將是:

num_client = threading.activeCount() - 1 # Don't count the main thread. 

當然,如果您的代碼的其他部分也交換線程,那麼這將不會給您正確的結果,因此要修復您可以通過爲客戶端添加計數器來覆蓋process_request()和process_request_thread()方法。

從例如here我寫的代碼,這段代碼來測試兩種方法

import time 
import socket 
import threading 
from SocketServer import ThreadingTCPServer, BaseRequestHandler 


def client(ip, port, message): 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock.connect((ip, port)) 
    sock.send(message) 
    response = sock.recv(1024) 
    sock.close() 


class ThreadedTCPRequestHandler(BaseRequestHandler): 

    def handle(self): 
     data = self.request.recv(1024) 
     cur_thread = threading.currentThread() 
     response = "%s: %s" % (cur_thread.getName(), data) 
     self.request.send(response) 
     time.sleep(1) 


class MyServer(ThreadingTCPServer): 

    def __init__(self, *args, **kws): 
     self._num_client = 0 
     ThreadingTCPServer.__init__(self, *args, **kws) 

    def process_request(self, *args, **kws): 
     print "swap thread" 
     self._num_client += 1 
     ThreadingTCPServer.process_request(self, *args, **kws) 

    def process_request_thread(self, *args, **kws): 
     ThreadingTCPServer.process_request_thread(self, *args, **kws) 
     print "kill thread" 
     self._num_client -= 1 

    def get_client_number(self): 
     return self._num_client 


def my_client_count(ignore=1): 
    return threading.activeCount() - ignore 


if __name__ == '__main__': 
    server = MyServer(("localhost", 0), ThreadedTCPRequestHandler) 

    server_thread = threading.Thread(target=server.serve_forever) 
    ip, port = server.server_address 

    server_thread.setDaemon(True) 
    server_thread.start() 

    print "client 1 connected" 
    client(ip, port, "Hello World 1") 
    print "number of client get_client_number : %s, enumerate : %s" \ 
     % (server.get_client_number(), my_client_count()) 
    print "client 2 connected" 
    client(ip, port, "Hello World 2") 
    print "number of client get_client_number : %s, enumerate : %s" \ 
     % (server.get_client_number(), my_client_count()) 

    time.sleep(3) 
    print "client 3 connected" 
    client(ip, port, "Hello World 3") 
    print "number of client get_client_number : %s, enumerate : %s" \ 
     % (server.get_client_number(), my_client_count()) 

輸出:

client 1 connected 
swap client thread 
number of client get_client_number : 1, enumerate : 2 
client 2 connected 
swap client thread 
number of client get_client_number : 2, enumerate : 3 
kill client thread 
kill client thread 
client 3 connected 
swap client thread 
number of client get_client_number : 1, enumerate : 2 

好吧,你可以看到第二種方式給予更精確的值,兩種方式之間的區別在於,因爲我的服務器正在使用線程運行,所以我總是使用+1線程來解釋差異1.

W埃爾希望這可以幫助:)