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 将它们全部放在一次读取中。当它解释读取的数据时,它会解析第一条消息并丢弃其余消息。

使用更好的协议,如 HTTP, AMP,或其他十几种协议中的任何一种,问题将自行解决。