【问题标题】:Python Twisted : Performing multiple writes at oncePython Twisted:一次执行多个写入
【发布时间】:2017-02-27 05:48:13
【问题描述】:

我正在尝试使用 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)

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

【问题讨论】:

    标签: python python-2.7 network-programming twisted


    【解决方案1】:

    首先,永远不要使用 pickle 作为有线协议。 pickle 模块允许在 unpickling 期间执行任意代码。如果您从网络加载 pickle 数据,您正在将远程代码执行漏洞直接构建到您的软件中。 切勿这样做。如果您信任对等方,或者它只是用于小型内部项目,或者是否有防火墙或您有某种身份验证,都没有关系。它最终导致问题。没有充分的理由放弃所有安全性来换取 pickle 的功能 - 有很多选项可以提供类似的功能而不会出现安全问题。

    除此之外,您的写作实际上可能一切都很好,并且都在进行中。问题是您的消息周围没有框架 协议。您所有的写入可能会组合在一起,并且读者可以在一次读取中将它们全部读取。当它解释它读取的数据时,它会解析第一条消息并丢弃其余的。

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

    【讨论】:

    • 谢谢(再次),我已经开始使用正确的协议,现在它可以工作了。再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 2012-06-24
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多