SocketServer.ThreadingTCPServer меняет местами новый поток для каждого клиентского соединения, поэтому знание количества клиентов, подключенных в определенный момент, равнозначно знанию количества потоков, работающих в этот момент, поэтому просто используйте threading.activeCount а номер клиента будет:
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.
Хорошо, надеюсь, это поможет:)