如何正确管理最大数量的已连接客户端-Python客户端服务器TCP

问题描述

我正在使用Python 3.6开发的tcp服务器和tcp客户端应用程序。
建立连接后,服务器会将数据发送到客户端,并从客户端本身接收数据。

服务器应接受最大数量的客户端。我想要的是,当达到连接的客户端的最大数量时,服务器不接受任何其他连接,并且通知客户端并中止该客户端。

这是服务器代码:

class ThreadedServer(object):

    def __init__(self,host,port,max_clients):
        self.host = host
        self.port = port
        self.max_clients = max_clients
        self.connected_clients = 0
        self.sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        self.sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
        self.sock.bind((self.host,self.port))

    def listen(self):
        self.sock.listen(5)
        
        while True:
        
            if self.connected_clients >= self.max_clients:
                print("Maximum number of clients reached")
                continue
        
            client,address = self.sock.accept()
        
            # keep track connected clients
            self.connected_clients += 1

            # start a new thread to send data to the connected client
            # start a new thread to receive data to the connected client


if __name__ == "__main__":
    HOST = "xxx.xxx.xxx.xxx"
    PORT = xxxx
    MAX_CLIENTS = x

    ThreadedServer(HOST,PORT,MAX_CLIENTS).listen()

客户端代码如下:

class ThreadedClient(object):

    def __init__(self,port):
        self.host = host
        self.port = port
        self.sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

    def send(self):
        self.sock.connect((self.host,self.port))
        
        # start a new thread to receive data to the server
        # start a new thread to send data to the server

if __name__ == "__main__":
    HOST = "xxx.xxx.xxx.xxx"
    PORT = xxxx

    ThreadedClient(HOST,PORT).send()

一切正常,直到达到最大连接客户端数。
启动“额外”客户端时,它不会(正确)从服务器接收任何信息,但会开始尝试发送数据。由于服务器未接受连接,因此未接收到数据。

我想要的是找到一种方法,以便在启动新线程之前理解服务器何时不接受客户端连接,以便正确管理此情况。

解决方法

您要先致电client.close(),然后才能实际获取客户端。这意味着最后一个被接受的客户端仍将在客户端变量中。此连接将关闭,而不是新的连接。

def listen(self):
    self.sock.listen(5)
    
    while True:
    
        client,address = self.sock.accept() # this line needs to be before the if

        if self.connected_clients >= self.max_clients:
            print("Maximum number of clients reached")
            client.close()
            continue
    
        # keep track connected clients
        self.connected_clients += 1

        # start a new thread to send data to the connected client
        # start a new thread to receive data to the connected client

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...