检测tcp客户端何时未激活超过5秒

时间:2017-10-19 15:30:06

标签: python tcp send

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

问题在于,如果我想从服务器发送重复的消息,我不能让它“忙”并开始接收消息,因此我无法检测到新消息何时从另一方到达并采取相应的行动。

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

是否有同时在单个套接字上接收和发送消息的选项?

谢谢!

2 个答案:

答案 0 :(得分:0)

选项1

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

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

选项2

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

答案 1 :(得分:0)

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

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

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