如何编码嵌套Python协议

2024-04-25 08:26:49 发布

您现在位置:Python中文网/ 问答频道 /正文

在这件事上被难住了一段时间,把我剩下的头发都拔了出来。在

将非嵌套的protobuf从Python发送到Java,将Java发送到Python WebSockets的问题。我的问题是通过WebSocket发送嵌套版本。我想我的问题是 Python编码方面。在

感谢您的指导。在

.proto文件

message Response {
  // Reflect back to caller
  required string service_name = 1;

  // Reflect back to caller
  required string method_name = 2;

  // Who is responding
  required string client_id = 3;

  // Status Code
  required StatusCd status_cd = 4;

  // RPC response proto
  optional bytes response_proto = 5;

  // Was callback invoked
  optional bool callback = 6 [default = false];

  // Error, if any
  optional string error = 7;
  //optional string response_desc = 6;
}

message HeartbeatResult {
    required string service = 1;
    required string timestamp = 2;
    required float status_cd = 3;
    required string status_summary = 4;
}

心跳信号结果应该在reponse_proto字段中发送 反应方案。我可以用Java-to-Java,但是Python 对Java无效。在

我已经包含了python代码的两个变体。这两种方法都不管用。在

^{pr2}$

Java服务器端的错误包括:

(GetHeartbeat) Protocol message end-group tag did not match expected tag
and
(GetHeartbeat2)
Message: [org.java_websocket.exceptions.InvalidDataException: java.nio.charset.MalformedInputException: Input length = 1
    at org.java_websocket.util.Charsetfunctions.stringUtf8(Charsetfunctions.java:80)
    at org.java_websocket.WebSocketImpl.deliverMessage(WebSocketImpl.java:561)
    at org.java_websocket.WebSocketImpl.decodeFrames(WebSocketImpl.java:328)
    at org.java_websocket.WebSocketImpl.decode(WebSocketImpl.java:149)
    at org.java_websocket.server.WebSocketServer$WebSocketWorker.run(WebSocketServer.java:593)
Caused by: java.nio.charset.MalformedInputException: Input length = 1
    at java.nio.charset.CoderResult.throwException(CoderResult.java:277)
    at java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:798)
    at org.java_websocket.util.Charsetfunctions.stringUtf8(Charsetfunctions.java:77)

Tags: toorgmessagestringrequiredjavaoptionalat
1条回答
网友
1楼 · 发布于 2024-04-25 08:26:49

解决方案

也在protobuf组上发布了这个问题

感谢克里斯托弗·海德和伊利亚·米尔金为谷歌集团提供的信息

https://groups.google.com/forum/#!topic/protobuf/Cp7zWiWok9I

response.response_proto = base64.b64encode(heartbeatResult.SerializeToString())
self.sendMessage(response.SerializeToString())

仅供参考,伊利亚还建议用base64编码整个消息,但目前看来这是可行的。在

相关问题 更多 >