2
A
回答
0
在「服務」客戶端的線程中,使用某些在客戶端連接時增加的全局計數,在斷開連接時使用某些全局計數。
如果你想從操作系統層面來算,然後使用nestat -an
適當grep
過濾器和wc -l
(在Windows上使用的grep
和wc
端口)
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埃爾希望這可以幫助:)
相關問題
- 1. 如何統計客戶端引用的客戶端數
- 2. 客戶端到客戶端的連接?
- 3. 連接客戶端
- 4. Ruby tcpserver客戶端服務器
- 5. SSIS中的客戶端統計信息
- 6. 在TCPServer(Ruby)中,我如何從客戶端獲取IP/MAC?
- 7. socketio客戶端:如何連接socketio
- 8. socket.io客戶端如何進行連接
- 9. 如何操縱客戶端連接
- 10. 如何從客戶端計算機連接到BDC服務
- 11. WinSock客戶端連接
- 12. boto3客戶端和連接
- 13. 客戶端關閉連接
- 14. 客戶端重新連接
- 15. SQL連接ClientInfo客戶端
- 16. Jmx連接客戶端
- 17. 客戶端無法連接
- 18. SignalR客戶端未連接
- 19. WCF客戶端連接
- 20. SignalR JavaScript客戶端連接
- 21. TCP客戶端連接
- 22. Netty客戶端連接
- 23. 客戶端斷開連接
- 24. socket.io客戶端不連接
- 25. 與WCF客戶端連接
- 26. Grokking客戶端Facebook連接?
- 27. 如何統計客戶端RadListBox中的項目數
- 28. GlusterFS在客戶端的統計信息
- 29. GAE連接Android客戶端的端點
- 30. 獨立客戶端中的JMS連接
每次連接被接受時加一個計數器,當它結束時減一個計數器? – Apalala 2011-03-20 19:16:10