接受与套接字的无限连接

时间:2017-01-11 15:50:52

标签: python sockets chat

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

2 个答案:

答案 0 :(得分:3)

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

您经常会看到用于积压参数的值5 - 这是历史性的。伯克利插座的早期版本有一个"功能"任何大于5的值都给出了5.所以5就是。很久以前就修好了,但它仍然不是你需要担心的数字 - 记住它只是一个提示。

如果超出了积压,则给客户端的实际错误通常是全能ECONNREFUSED,但旧系统过去常常出现积压错误。

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

另见listen() ignores the backlog argument?

答案 1 :(得分:2)

你想要一个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下)非常接近你想要实现的目标。