Python 如何统计TCPServer中连接的客户端?

Python 如何统计TCPServer中连接的客户端?,python,tcp,network-programming,Python,Tcp,Network Programming,我正在使用Pythons SocketServer.threadingcpserver。现在我想知道在某一时刻有多少客户机被连接 如何解决这个问题?在“服务”客户机的线程中,使用一些全局计数,当客户机连接时会增加,当断开连接时会减少 如果要从操作系统级别进行计数,请使用带有适当的grep过滤器和wc-l的nestat-an(在Windows上使用grep和wc端口)SocketServer.ThreadingCpserver为每个客户端连接交换一个新线程,因此知道某一时刻连接的客户端数量与知道该

我正在使用Pythons SocketServer.threadingcpserver。现在我想知道在某一时刻有多少客户机被连接

如何解决这个问题?

在“服务”客户机的线程中,使用一些全局计数,当客户机连接时会增加,当断开连接时会减少


如果要从操作系统级别进行计数,请使用带有适当的
grep
过滤器和
wc-l
nestat-an
(在Windows上使用
grep
wc
端口)

SocketServer.ThreadingCpserver为每个客户端连接交换一个新线程,因此知道某一时刻连接的客户端数量与知道该时刻有多少线程处于活动状态是一样的,因此只需使用,客户端数量将为:

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

当然,如果代码的其他部分也交换了线程,那么这将不会给出正确的结果,因此要解决这个问题,您可以通过为客户端添加计数器来覆盖process_request()和process_request_thread()方法

在这个示例中,我编写了这段代码来测试这两种方法

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


我们希望这能有所帮助:)

在每次接受连接时向计数器添加一个,在连接结束时减去一个?