问题

写了个 websockets 连接服务器,用的是 protobuf 协议,序列化成功后发送服务器,成功收到返回(这里以登录协议来说明),并且确认了日志和游戏另一个客户端成功踢下线。然后收到服务器返回之后用 ParseFromString 去反序列化,也是成功拿到了返回的数据。但是返回数据中的 data 字段其实是一个嵌套的 protobuf,这里尝试多次实在不知如何解码,请论坛各位大佬指点迷津。

部分代码如下:

async def main_logic():
    async with websockets.connect(_server_ws_url) as ws:
        await ws.send(loginmsg.SerializeToString())
        recv_text = await ws.recv()
        logininfo.ParseFromString(recv_text)
        print(logininfo)
        print(logininfo.result, logininfo.messageId)
//服务端发给客户端的命令数据
message ServerCmdData {
    required sint32 messageId = 1;
    required sint32 clientIndex = 2;
    required sint32 serverIndex = 3;
    optional bytes data = 4;//命令主数据
    required bool result = 5;
}

拿到的返回数据,反序列化之后结果如下

messageId: 1001
clientIndex: 0
serverIndex: 1
data: "\n<18c04dfffe136cb9-000017cc-0000000f-2a58a19679d30b77-2e650bea\022V\010\226\254\366\300\235\003\022\006poke22\030\027 \327\017(\352\0140\214\211\321\322\0038\324>@\000H\241\302\036P\000X\000`\000h\017p\244Nx\000\200\001\345\304\023\210\001\000\220\001\003\230\001\361\274\014\240\001\336\332\220\377\005\250\001\000\260\001\000\270\001\000\300\001\000"
result: true

客户端发送大概是这样的:第一层 message 数据序列化,作为客户端 message 的 data 数据,再整个 message 序列化发送。所以我以为服务器也是这样,登录返回相关的 message 序列化后作为 message ServerCmdData 的 data(byes 类型) 主数据,再整个 message ServerCmdData 序列化后发送给客户端。但是我不知道怎么解码接收到的 data。


↙↙↙阅读原文可查看相关链接,并与作者交流