【问题标题】:How to correctly manage a maximum number of connected clients - Python Client Server TCP如何正确管理最大连接客户端数 - Python Client Server TCP
【发布时间】:2020-12-18 03:04:51
【问题描述】:

我正在使用 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, host, 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()

在达到最大连接客户端数之前,一切正常。
当启动“额外”客户端时,它不会(正确)从服务器接收任何内容,但它开始尝试发送数据。未收到数据,因为服务器不接受连接。

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

【问题讨论】:

    标签: python python-3.x sockets tcp tcpclient


    【解决方案1】:

    您在实际检索客户端之前调用了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
    

    【讨论】:

    • 是的,你是对的,对不起......这是一个错误,我在 if 语句中删除了 client.close()。关键是当达到最大客户端数量时,我不想接受来自服务器端的任何新连接。这就是 self.sock.accept() 在 if 语句之后的原因
    • 我很确定,如果你不接受连接,对方就无法确定连接是超时还是不被接受
    • 好的,但这是管理最大客户端数量的正确方法吗?还是有其他方法可以正确管理它?
    • 我找到了这个建议接受并立即关闭连接的答案,您可以考虑发送一些东西来说明为什么它被关闭了艰难stackoverflow.com/questions/19214552/…
    • 谢谢,我已经修改了我的代码以便接受连接,然后在达到最大客户端数时关闭它。谢谢
    猜你喜欢
    • 2013-06-27
    • 1970-01-01
    • 2017-12-30
    • 2020-10-15
    • 1970-01-01
    • 2015-11-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多