我正在尝试制作聊天服务器。基本上,我希望多个客户端能够同时连接。
我想要它所以它总是在听。每当有人试图连接时,它会立即接受它们并将它们添加到连接列表中。
我可以有一个监听(1)然后超时,并继续将它们附加到列表然后关闭套接字,然后创建一个新的,然后用超时监听等等。虽然,这看起来很慢,而且我我甚至不确定它会起作用
请记住,它不一定是套接字。如果有任何其他类型的网络接口,它也可以正常工作。
答案 0 :(得分:3)
基于系统内存的最大插槽数量会有实际限制。
见http://docs.python.org/2/library/socketserver.html。我认为最后几个例子(在Asynchronous Mixins下)非常接近你想要实现的目标。
答案 1 :(得分:2)
考虑您是否确实需要为每个连接维护单独的套接字。像无连接UDP这样的东西会合适吗?这样,只需使用一个OS套接字就可以支持任意数量的用户。
当然,使用这种方法,您需要在内部维护连接语义(如果您的应用程序关心这些事情);通过查看他们的IP /端口或通过检查网络协议中的一些包络数据来确定每个数据报的用户,发送偶尔的ping以查看对方是否还活着,等等。但是这种方法应该很好地将你分开来自任何操作系统的问题RE:允许您的进程一次保持打开的套接字数量。
答案 2 :(得分:1)
你正在看问题有点不对劲。使用服务器端套接字,您接受到同一套接字的连接,然后由其他进程/线程处理。
#
# Setup socket and other handling stuff here
#
while True:
conn = sock.accept()
thread.start_new_thread(handler, (conn,))
答案 3 :(得分:0)
我想要它所以它总是在听。每当有人试图连接时,它会立即接受它们并将它们添加到连接列表中。
所以你只有:
一个accept()循环,它只接受()接受()新连接并启动一个新线程来处理每个连接。
每个连接使用长超时读取的线程,无论您希望会话空闲超时。如果超时到期,则关闭套接字并退出线程。
如果服务器耗尽了FD,如果有足够的同时连接,那么accept()将开始使用相应的errno失败:在这种情况下,您只需忽略它并继续循环。也许你在这种情况下减少了空闲超时,并在接受再次开始工作时将其恢复。