我使用javascript作为客户端,使用python作为服务器。
我需要使用协议缓冲区在它们之间发送/接收。
我的原型看起来像这样:
message CMsgBase
{
required CMsgHead msghead = 1;
optional bytes msgbody = 2;
}
message CMsgHead
{
required int32 msgtype = 1;
required int32 msgcode = 2;
}
我在javascript中使用protobuf.js,并使用带有POST方法的XMLHttpRequest将数据发送到服务器:
xhr.send(pbMessage.encodeAB());
服务器端可以接收此消息并成功解码:
def do_POST(self):
pbMessage = self.rfile.read(length)
# ...
问题是我无法解码从服务器端收到的javascript端数据。
以下是我如何从服务器向客户端发送数据:
pbMessageReturn = CMsgBase()
# ......
self.send_response(200)
self.end_headers()
"""Serializes the protocol message to a binary string.
Returns:
A binary string representation of the message if all of the required
fields in the message are set (i.e. the message is initialized).
"""
self.wfile.write(pbMessageReturn.SerializeToString())
这是服务器端print(pbMessageReturn)的结果:
msghead {
msgtype: 10006
msgcode: 1
}
msgbody: "\n\014192.168.1.16"
一切似乎都没问题。
以下是我在javascript中解码来自服务器的消息:
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
var result = xhr.responseText;
var recvMessage = CMsgBase.decode(result, "utf8");
}
};
我有一个错误:
protobuf.js:2335 Uncaught Error: Missing at least one required field for Message .CMsgBase: msghead(…)
顺便说一句,如果我尝试发回数据而不将其序列化:
self.wfile.write(pbMessageReturn)
我在javascript中得到的回复是:
console.log(xhr.responseText);
msghead {
msgtype: 10006
msgcode: 1
}
msgbody: "\n\014192.168.1.16"
我真的不确定错误是在服务器端还是在客户端。
任何建议都将不胜感激,谢谢:)