在随机时间作为客户端接收服务器消息

Receive server messages as a client in random time

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

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

阻止

您的代码大致如下所示:

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

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

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

在这种情况下,对 recv 的调用是阻塞的,这意味着它不会 return 直到服务器发送一些数据。

请注意,这非常简单,因为 recv 可能会 return 只有您期望的部分数据,因此 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 将读取一些数据(与之前的情况相同,它可能只获取部分数据,因此需要额外处理)。

关于此的更多介绍信息是here and some examples are here