我试图一个接一个地使用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)
我是否以正确的方式进行写入?我确实希望它们是两个独特的信息。
答案 0 :(得分:1)
首先,不要使用泡菜作为电线协议。 pickle模块允许在unpickling期间执行任意代码。如果从网络加载pickle数据,则会在软件中构建远程执行代码漏洞。 从不这样做。如果您信任同伴,或者仅仅针对一个小型内部项目,或者是否有防火墙或您有某种身份验证,那么无关紧要。 最终会导致问题。没有充分理由将所有的安全性换成pickle所做的 - 有很多选项提供类似的功能而没有安全问题。
有了这个,你写的可能实际上都很好并且都在经历。问题是您的邮件周围没有框架协议。您的所有写入可能会合并在一起,读者只需一次读取即可。当它解释它已读取的数据时,它会解析第一条消息并删除其余的消息。