【问题标题】:how can I parse prefixed length message from TCP stream in twisted python?如何在twisted python中解析来自TCP流的前缀长度消息?
【发布时间】:2018-07-18 17:03:48
【问题描述】:

我正在使用 python twisted 对 tcp 客户端/服务器进行编码 为了替换 Java 或 C#。 我必须在连接的永久会话中根据 ANS(字母数字字符串)解析长度前缀字符串消息。

  • 像这样:
    • 消息格式:[字母数字字符串:4字节][消息数据]
    • example-1 : 0004ABCD ==> ABCD
    • example-2 : 0002AB0005HELLO ==> AB,HELLO

IntNProtocol、NetStringProtocol 都无法解决。

如果客户端从应用层发送一个 2kb 的消息,内核会按照 MSS(最大段大小)拆分消息数据,并拆分发送数据包。

在 TCP 发送/接收环境中,它经常这样引发:

  • 示例:1000HELLO {尚未到达 995 字节数据}

所以它必须等待使用数组、队列接收备用数据...

在扭曲中,我不知道如何解析多个大消息。

有人帮我提供一些信息或网址吗?

class ClientProtocol(protocol.Protocol):
    def dataReceived(self, data):
        # how can I code to parse multiple large message?
        # is there solution to read specific size for data ?

【问题讨论】:

    标签: python parsing tcp twisted codec


    【解决方案1】:

    看起来您可以使用StatefulProtocol 作为基础来实现此协议。您的协议基本上有两种状态。在第一种状态下,您正在等待 4 个字节,您将其解释为一个零填充的以 10 为基数的整数。在第二种状态中,您正在等待的字节数等于在第一种状态中读取的整数。

    from twisted.protocols.stateful import StatefulProtocol
    
    class ANSProtocol(StatefulProtocol):
        def getInitialState(self):
            return (self._state_length, 4)
    
        def _state_length(self, length_bytes):
            length = int(length_bytes)
            return self._state_content, length
    
        def _state_content(self, content):
            self.application_logic(content)
            return self.getInitialState()
    
        def application_logic(self, content):
            # Application logic operating on `content`
            # ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-12
      • 2012-07-23
      • 1970-01-01
      • 2019-04-12
      • 2021-09-28
      • 1970-01-01
      • 2019-11-04
      • 1970-01-01
      相关资源
      最近更新 更多