【问题标题】:Accept unlimited connections with socket接受与套接字的无限连接
【发布时间】:2017-05-26 11:56:45
【问题描述】:

我正在使用套接字编程在 python 中创建一个简单的聊天应用程序,我需要我的套接字接受无限数量的连接,这与限制为 100 的“socket.listen(100)”不同。请解释我应该怎么做处理大量连接?

【问题讨论】:

  • 您的无限连接是否有无限带宽?
  • 是的,我有一个无限带宽的 VPS。
  • socket.listen 的参数是尚未accepted 的最大挂起连接数。它不限制已建立的连接数。
  • 你的意思是如果我设置 socket.listen(5) 它将接受例如 10 个客户端同时连接?

标签: python sockets chat


【解决方案1】:

您希望有一个 accept() 循环,除了 accept() 新连接之外什么都不做,并启动一个新线程来处理每个连接。每当有人尝试连接时,它都会立即接受它们并将它们添加到连接列表中。

每个连接的一个线程读取一个长超时,无论您希望会话空闲超时是什么。如果超时到期,则关闭套接字并退出线程。

如果服务器耗尽 FD,如果有足够的同时连接,accept() 将开始失败并显示相应的 errno:在这种情况下,您只需忽略它并继续循环。也许您在这种情况下减少空闲超时,并在接受再次开始工作时将其放回。

您对问题的看法略有错误。使用服务器端套接字,您接受到同一个套接字的连接,然后由其他进程/线程处理。

#
# Setup socket and other handling stuff here
#

while True:
    conn = sock.accept()
    thread.start_new_thread(handler, (conn,))

根据您的系统内存,最大套接字数会有实际限制。

见http://docs.python.org/2/library/socketserver.html。我认为最后几个示例(在 Asynchronous Mixins 下)非常接近您想要实现的目标。

【讨论】:

    【解决方案2】:

    listen() 给出的数字是 backlog 队列的大小 - 提示 待处理请求的数量,而不是活动请求的数量。

    您经常会看到用于 backlog 参数的值 5 - 这是历史记录。 Berkeley 套接字的早期版本有一个“特性”,即任何大于 5 的值都会给出 5。所以它是 5。这在很久以前就已修复,但它仍然不是您需要过多担心的数字 - 请记住,它只是一个提示。

    如果超过了积压,则给客户端的实际错误通常是包罗万象的ECONNREFUSED,但旧系统过去常常有特定的积压错误。

    在许多系统上,积压工作被静默截断为SOMAXCONN。

    另见listen() ignores the backlog argument?

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多