在随机时间作为客户端接收服务器消息
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
将读取一些数据(与之前的情况相同,它可能只获取部分数据,因此需要额外处理)。
我正在尝试在 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
将读取一些数据(与之前的情况相同,它可能只获取部分数据,因此需要额外处理)。