我试图用python编写一个简单的Messenger,所以当另一个客户端将消息发送到服务器时,我必须从服务器接收消息。我使用套接字,是否有一种简单的方法来接收这些随机消息,还是必须在客户端中编写一些“ while True”构造?
答案 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
将读取一些数据(与以前的情况相同,它可能仅获取部分数据,因此需要进行其他处理)。