Python Twisted:一次执行多个写入
Python Twisted : Performing multiple writes at once
我正在尝试使用 Twisted(见下文)一个接一个地发送两条消息,但没有收到第二条消息。
服务器打印出它收到的消息:
New connections (1) made... Total : 1
{'ID': 1}
{'ID': 0}
{'ID': 0}
客户代码是:
class TestClient(protocol.Protocol):
def SendKeepAliveMsg(self):
lst = {"ID" : 0}
self.transport.write(pickle.dumps(lst))
def SendMsg_StartHandshake(self, unused):
lst = {"ID" : 1}
self.transport.write(pickle.dumps(lst))
def SendMsg_CompleteHandshake(self, unused):
lst = {"ID" : 2}
self.transport.write(pickle.dumps(lst))
def connectionMade(self):
d = Deferred()
d.addCallback(self.SendMsg_StartHandshake)
d.addCallback(self.SendMsg_CompleteHandshake)
d.callback(None)
lc = LoopingCall(self.SendKeepAliveMsg)
lc.start(3)
我的写入方式是否正确?我确实希望它们是两条独特的消息。
首先,永远不要使用 pickle 作为有线协议。 pickle 模块允许在 unpickling 期间执行任意代码。如果您从网络加载 pickle 数据,则您正在将远程代码执行漏洞直接构建到您的软件中。 永远不要这样做。无论您是否信任对等点,或者它是否仅用于小型内部项目,或者是否有防火墙,或者您是否有某种身份验证,都没有关系。它最终会导致问题。没有充分的理由为了 pickle 的功能而放弃所有的安全性 - 有很多选项可以提供类似的功能而没有安全问题。
除此之外,您的写入可能实际上一切正常并且全部通过。问题是您的消息没有 framing 协议。您的所有写入可能会合并在一起,并且 reader 将它们全部放在一次读取中。当它解释读取的数据时,它会解析第一条消息并丢弃其余消息。
我正在尝试使用 Twisted(见下文)一个接一个地发送两条消息,但没有收到第二条消息。
服务器打印出它收到的消息:
New connections (1) made... Total : 1
{'ID': 1}
{'ID': 0}
{'ID': 0}
客户代码是:
class TestClient(protocol.Protocol):
def SendKeepAliveMsg(self):
lst = {"ID" : 0}
self.transport.write(pickle.dumps(lst))
def SendMsg_StartHandshake(self, unused):
lst = {"ID" : 1}
self.transport.write(pickle.dumps(lst))
def SendMsg_CompleteHandshake(self, unused):
lst = {"ID" : 2}
self.transport.write(pickle.dumps(lst))
def connectionMade(self):
d = Deferred()
d.addCallback(self.SendMsg_StartHandshake)
d.addCallback(self.SendMsg_CompleteHandshake)
d.callback(None)
lc = LoopingCall(self.SendKeepAliveMsg)
lc.start(3)
我的写入方式是否正确?我确实希望它们是两条独特的消息。
首先,永远不要使用 pickle 作为有线协议。 pickle 模块允许在 unpickling 期间执行任意代码。如果您从网络加载 pickle 数据,则您正在将远程代码执行漏洞直接构建到您的软件中。 永远不要这样做。无论您是否信任对等点,或者它是否仅用于小型内部项目,或者是否有防火墙,或者您是否有某种身份验证,都没有关系。它最终会导致问题。没有充分的理由为了 pickle 的功能而放弃所有的安全性 - 有很多选项可以提供类似的功能而没有安全问题。
除此之外,您的写入可能实际上一切正常并且全部通过。问题是您的消息没有 framing 协议。您的所有写入可能会合并在一起,并且 reader 将它们全部放在一次读取中。当它解释读取的数据时,它会解析第一条消息并丢弃其余消息。