gpt4 book ai didi

python - 如何仅在必要时从套接字读取数据

转载 作者:太空宇宙 更新时间:2023-11-04 10:07:02 25 4
gpt4 key购买 nike

我正在与只有一个支持基本 API 调用的基本 API 的硬件通信。

不幸的是,有些 API 调用会非法响应,有些则不会。我想在有响应时阅读响应,或者在没有响应时什么也不做。

这是我一直在使用的代码:

def send_message(self, message, host):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((host, self.PORT))
s.send(bytes(message, 'ascii'))
data = s.recv(1024)
print(data)

不幸的是,当没有收到数据时,这会绑定(bind)整个过程。我只想在有实际响应时读取数据。有没有办法用 Python 标准库来做到这一点?

最佳答案

首先,如果您可以控制目标 API,我建议对每条消息实现回复。对发送的每条消息的回复 ACK(确认)将使您的 API 更加健壮,并完全回避这个问题。

如果那不是一个选项,那么我会为不同类型的消息创建类:

class Message(object):
def __init__(self, msg):
self.msg = msg

class MessageWReply(Message):
await_reply = True

class MessageNoReply(Message):
await_reply = False

创建所有消息类,然后像这样使用它们:

def send_message(self, message, host):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((host, self.PORT))
s.send(bytes(message, 'ascii'))

if message.await_reply:
data = s.recv(1024)
print(data)

或者,如果您不想创建所有类的开销,您可以使用字典将消息映射到正确的操作:

messages = {
'message with reply 1': True, # wait for reply
'message with reply 2': True,
'message with reply 2': True,
'message without reply 1': False, # don't wait for reply
'message without reply 2': False
}

然后这样做:

def send_message(self, message, host):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((host, self.PORT))
s.send(bytes(message, 'ascii'))

if messages[message]:
data = s.recv(1024)
print(data)

第二种方法初始化更清晰(样板代码更少),但不太清晰。对于不熟悉代码的人,不清楚存储在 messages[message] 中的值的实际含义,而 message.await_reply 则非常清楚。类似于 named tuples可能是一个很好的折衷方案 - 您可以在一个数据结构中初始化所有内容,同时为了清晰起见仍然使用命名字段。

关于python - 如何仅在必要时从套接字读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40476784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com