检测tcp客户端未处于活动状态的时间超过5秒
问题描述:
我尝试进行tcp通信,其中服务器每隔x秒通过一个套接字发送一条消息,并且应该停止发送这些消息,而客户端没有发送任何消息5秒钟。 更为详细的是,客户端还会发送一些常数消息,这些消息在与上面相同的套接字上被服务器忽略,并且可以在任何未知的时间停止发送它们。为简单起见,这些消息用作活动消息来通知服务器通信仍然相关。检测tcp客户端未处于活动状态的时间超过5秒
问题是,如果我想从服务器发送重复的消息,我不能允许它“忙”并开始接收消息,因此我无法检测到新消息何时从另一端到达并相应地采取行动。
这个问题是独立于编程语言,但更具体的即时通讯使用Python,并且不能访问客户端的代码。
是否有任何选项可以同时在单个套接字上接收和发送消息?
谢谢!
答
选项1
使用两个线程,一个会写信给插座和第二将从中读取。
由于套接字是全双工的(允许双向同时访问),因此可以使用。
选项2
使用管理所有保持活动使用select.epoll
一个单独的线程。这样一个线程可以处理多个客户端。请记住,如果这不是唯一使用套接字的线程,那么您可能需要自行处理线程安全。
答
正如在另一个答案中所讨论的那样,线程是一种常见方法。另一种方法是使用事件循环和非阻塞I/O。 Python的最新版本(我认为从3.4开始)包含一个名为asyncio
的包,它支持这个。
您可以调用event_loop上的create_connection
方法来创建asyncio
连接。请参阅this example,了解通过TCP读取和写入的简单服务器。
在许多情况下,事件循环可以允许比线程更高的性能,但它的缺点是要求大部分或全部代码知道事件模型。