检测 tcp 客户端何时不活动超过 5 秒

Detecting when a tcp client is not active for more than 5 seconds

我正在尝试进行 tcp 通信,其中服务器每 x 秒通过套接字发送一条消息,并且应该在客户端 5 秒内未发送任何消息的特定条件下停止发送这些消息。 更详细地说,客户端还发送常量消息,这些消息在与上述相同的套接字上都被服务器忽略,并且可以在任何未知时间停止发送它们。为简单起见,这些消息用作活动消息以通知服务器通信仍然相关。

问题是,如果我想从服务器发送重复的消息,我不能让它 "get busy" 而是开始接收消息,因此我无法检测到新消息何时从另一端到达并且相应地采取行动。

问题与编程语言无关,但更具体地说,我使用 python,无法访问客户端代码。

是否可以选择在单个套接字上同时接收和发送消息?

谢谢!

选项 1

使用两个线程,一个写入套接字,第二个从套接字读取。

这是可行的,因为套接字是全双工的(允许双向同时访问)。

选项 2

使用单个线程来管理所有使用 select.epoll 的保持活动状态。这样一个线程可以处理多个客户端。但请记住,如果这不是唯一使用套接字的线程,您可能需要自己处理线程安全

正如另一个答案中所讨论的,线程是一种常见的方法。另一种方法是使用事件循环和非阻塞 I/O。 Python 的最新版本(我认为从 3.4 开始)包括一个名为 asyncio 的包,它支持这个。

您可以在 event_loop 上调用 create_connection 方法来创建 asyncio 连接。请参阅 this example 了解通过 TCP 读写的简单服务器。

在许多情况下,事件循环可以允许比线程更高的性能,但它的缺点是要求大部分或所有代码都知道事件模型。