Python Twisted:一次执行多次写入

时间:2017-02-27 05:48:13

标签: python python-2.7 network-programming twisted

我试图一个接一个地使用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)

我是否以正确的方式进行写入?我确实希望它们是两个独特的信息。

1 个答案:

答案 0 :(得分:1)

首先,不要使用泡菜作为电线协议。 pickle模块允许在unpickling期间执行任意代码。如果从网络加载pickle数据,则会在软件中构建远程执行代码漏洞。 从不这样做。如果您信任同伴,或者仅仅针对一个小型内部项目,或者是否有防火墙或您有某种身份验证,那么无关紧要。 最终会导致问题。没有充分理由将所有的安全性换成pickle所做的 - 有很多选项提供类似的功能而没有安全问题。

有了这个,你写的可能实际上都很好并且都在经历。问题是您的邮件周围没有框架协议。您的所有写入可能会合并在一起,读者只需一次读取即可。当它解释它已读取的数据时,它会解析第一条消息并删除其余的消息。

使用更好的协议,例如HTTPAMP或其他任何协议,问题就会自行解决。