首页 > 解决方案 > 在随机时间作为客户端接收服务器消息

问题描述

我正在尝试在 python 中编写一个简单的信使,因此当另一个客户端将消息发送到那里时,我必须从服务器接收消息。我使用套接字,那么有没有一种简单的方法来接收这些随机消息,或者我是否必须在我的客户端中编写一些“while True”构造?

标签: pythonserverclient

解决方案


有两种模式:阻塞和非阻塞。

阻塞

您的代码示意图如下所示:

while not stop:
    message = read_message_from_socket(socket)
    # do something with message

stop是一个变量,用于通知客户端它应该停止处理来自服务器的消息。

read_message_from_socket使用recv方法从服务器读取数据。

在这种情况下,调用recv是阻塞的,这意味着在服务器发送一些数据之前它不会返回。

请注意,这是非常简化的,因为它可能recv只会返回您期望的部分数据,因此内部可能会有一个循环read_message_from_socket等待整个消息被读取(它可能基于消息的已知大小或者它可能依赖于像行尾这样的符号)。

非阻塞

在这种情况下,客户端的代码示意性地如下所示:


sel = selectors.DefaultSelector()

while not stop:
    events = sel.select(timeout=None)
    for key, mask in events:
        service_connection(key, mask)

        if mask & selectors.EVENT_READ:
           socket = key.fileobj
           message = read_actual_message_from_socket(socket)
           # process the message

在这种情况下,调用select将阻塞,直到新数据从服务器到达。并且保证read_actual_message_from_socket会读取一些数据(与前一种情况相同,它可能只获取部分数据,因此需要额外处理)。

更多关于这方面的介绍信息在这里,一些例子在这里


推荐阅读