Pythons SocketServer.ThreadingTCPServer를 사용하고 있습니다. 이제 얼마나 많은 고객이 특정 순간에 연결되는지 알고 싶습니다.TCPServer에서 연결된 클라이언트 수를 계산하는 방법?
해결 방법?
Pythons SocketServer.ThreadingTCPServer를 사용하고 있습니다. 이제 얼마나 많은 고객이 특정 순간에 연결되는지 알고 싶습니다.TCPServer에서 연결된 클라이언트 수를 계산하는 방법?
해결 방법?
클라이언트를 "제공"하는 스레드에서 클라이언트가 연결될 때 증가하는 전역 카운트를 사용하고 연결이 끊어 질 때 감소합니다.
그렇게 수를 알고있는 각 클라이언트 연결에 대한 새 스레드를 교환 SocketServer.ThreadingTCPServer
(Windows가 grep
및 wc
의 포트를 사용에서) 다음 적절한 grep
필터와 wc -l
와 nestat -an
를 사용하여 OS 수준에서 계산하려면
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 이것이 도움이 되길 바랍니다.
연결이 수락 될 때마다 카운터에 하나를 더하고 연결이 종료되면 하나를 뺍니다. – Apalala