gpt4 book ai didi

python - 如何统计 TCPServer 中已连接的客户端?

转载 作者:可可西里 更新时间:2023-11-01 02:33:42 26 4
gpt4 key购买 nike

我正在使用 Python 的 SocketServer.ThreadingTCPServer。现在我想知道在某个时刻连接了多少个客户端。

如何解决?

最佳答案

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 的区别。

希望这对您有所帮助:)

关于python - 如何统计 TCPServer 中已连接的客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5370778/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com