0

我正在尝试制作聊天服务器。基本上,我希望多个客户端能够同时连接。

我想要它,所以它总是在听。每当有人尝试连接时,它都会立即接受它们并将它们添加到连接列表中。

我可以有一个listen(1)然后超时,并继续将它们附加到一个列表然后关闭套接字,并创建一个新的,然后超时监听等等。虽然,这看起来很慢,我不是甚至确定它会起作用

请记住,它不必是套接字。如果有任何其他类型的网络接口,它也可以正常工作。

4

4 回答 4

3

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

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

于 2012-11-14T22:12:45.590 回答
2

考虑您是否真的需要为每个连接维护单独的套接字。像无连接UDP这样的东西合适吗?这样你就可以支持任意数量的用户,同时只使用一个 OS 套接字。

当然,使用这种方法,您需要在内部维护连接语义(如果您的应用程序关心这些事情);通过查看他们的 IP/端口或通过检查网络协议中的一些信封数据来确定每个数据报已发送到哪个用户,偶尔发送 ping 以查看另一端是否还活着,等等。但是这种方法应该很好地将你分开来自任何操作系统问题 RE:允许您的进程一次保持打开的套接字数量。

于 2012-11-14T22:19:22.347 回答
1

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

#
# Setup socket and other handling stuff here
#

while True:
    conn = sock.accept()
    thread.start_new_thread(handler, (conn,))
于 2012-11-14T22:43:17.683 回答
0

我想要它,所以它总是在听。每当有人尝试连接时,它都会立即接受它们并将它们添加到连接列表中。

所以你只有:

  1. 一个 accept() 循环,除了 accept() 新连接之外什么都不做,并启动一个新线程来处理每个连接。

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

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

于 2012-11-15T00:24:31.227 回答