python - 在随机时间作为客户端接收服务器消息
问题描述
我正在尝试在 python 中编写一个简单的信使,因此当另一个客户端将消息发送到那里时,我必须从服务器接收消息。我使用套接字,那么有没有一种简单的方法来接收这些随机消息,或者我是否必须在我的客户端中编写一些“while True”构造?
解决方案
有两种模式:阻塞和非阻塞。
阻塞
您的代码示意图如下所示:
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
会读取一些数据(与前一种情况相同,它可能只获取部分数据,因此需要额外处理)。
推荐阅读
- sql - 为查询的所有行重复一个输出列
- .net-4.0 - 在 .Net 中使用 ModBusTCPCom 读取 PLC 寄存器导致找不到地址
- java - 在 Windows 10 上运行与在 Linux 上相同的 UTF-8 Java 文件
- html - 裁剪后的中心图像
- vb.net - 替换确切的单词
- html - maxlength 在 android 设备的浏览器中不工作,但在桌面浏览器中工作
- build.gradle - 执行 ./gradlew 检查运行 SOOT 时出现 java.lang.IllegalArgumentException
- javascript - 取消 axios .then 逻辑与拦截器和取消令牌的问题
- python - ValueError: Solver lbfgs 仅支持“l2”或“none”惩罚,得到 l1 惩罚
- c++ - 如何初始化双指针字符数组,如下所示?