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

时间:2019-04-23 20:08:07

标签: python server client

我试图用python编写一个简单的Messenger,所以当另一个客户端将消息发送到服务器时,我必须从服务器接收消息。我使用套接字,是否有一种简单的方法来接收这些随机消息,还是必须在客户端中编写一些“ while True”构造?

1 个答案:

答案 0 :(得分:0)

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

阻止

您的代码示意图如下:

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将读取一些数据(与以前的情况相同,它可能仅获取部分数据,因此需要进行其他处理)。

关于此的更多介绍性信息是here,而一些示例是here