【问题标题】:Detecting when a tcp client is not active for more than 5 seconds检测 tcp 客户端何时不活动超过 5 秒
【发布时间】:2018-03-31 16:59:29
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

    标签: python tcp send


    【解决方案1】:

    选项 1

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

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

    选项 2

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

    【讨论】:

      【解决方案2】:

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

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

      在许多情况下,事件循环可以提供比线程更高的性能,但它的缺点是要求您的大部分或全部代码都了解事件模型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-30
        • 2017-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多