잠시 동안이 문제에 곤란을 겪었고 내 머리카락을 떠났습니다.중첩 된 파이썬을 인코딩하는 방법 Protobuf
Python에서 Java로, Java에서 Python으로 중첩되지 않은 Protobufs를 웹 소켓에 문제없이 보내야합니다. 내 문제는 WebSocket 통해 중첩 된 버전을 보내는 것입니다. 내 문제는 파이썬 인코딩 측면에 있다고 생각합니다.
귀하의 지침에 감사드립니다.
.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;
}
하트 비트 결과는 응답 Protobuf의 reponse_proto 필드 전송받을 예정이다. Java에서 Java로이 작업을 수행 할 수 있지만 Java로 Python 이 작동하지 않습니다.
저는 파이썬 코드의 두 가지 변형을 포함 시켰습니다. 어느 쪽도 작동하지 않습니다. 자바 서버 측
def GetHeartbeat(self):
print "GetHeartbeat called"
import time
ts = time.time()
import datetime
st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
heartbeatResult = rpc_pb2.HeartbeatResult()
heartbeatResult.service = "ALERT_SERVICE"
heartbeatResult.timestamp = st
heartbeatResult.status_cd = rpc_pb2.OK
heartbeatResult.status_summary = "OK"
response = rpc_pb2.Response()
response.service_name = ""
response.method_name = "SendHeartbeatResult"
response.client_id = "ALERT_SERVICE"
response.status_cd = rpc_pb2.OK
response.response_proto = str(heartbeatResult).encode('utf-8')
self.sendMessage(response.SerializeToString())
print "GetHeartbeat finished"
def GetHeartbeat2(self):
print "GetHeartbeat called"
import time
ts = time.time()
import datetime
st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
heartbeatResult = rpc_pb2.HeartbeatResult()
heartbeatResult.service = "ALERT_SERVICE"
heartbeatResult.timestamp = st
heartbeatResult.status_cd = rpc_pb2.OK
heartbeatResult.status_summary = "OK"
response = rpc_pb2.Response()
response.service_name = ""
response.method_name = "SendHeartbeatResult"
response.client_id = "ALERT_SERVICE"
response.status_cd = rpc_pb2.OK
response.response_proto = heartbeatResult.SerializeToString()
self.sendMessage(response.SerializeToString())
print "GetHeartbeat finished"
오류는 다음과 같습니다
은 또한에 입력을 제공신용 크리스토퍼 머리와 일리아 Mirkin에 protobuf 그룹에이 질문을 게시
(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)
왜 상태 코드가 부동 상태입니까? 그리고'rpc_pb2.OK'를 어딘가에 정의 할 필요가 있습니까? – user2357112
눈이 좋습니다. 게시물이 이미 너무 길어서 rpc_pb2.OK를 빠뜨릴 까봐 두려웠습니다. 여기에 enum StatusCd { // 서버 측 오류 OK = 1; ... } 또한 상태 코드가 부동되어서는 안됩니다 ... 오류가 발생했습니다. – JeffSpicoli
클라이언트와 서버가 호환되는 .proto 파일을 사용하고 있습니까? 어쩌면 필드 유형이 달라 지거나 다를 수 있습니다. – user2357112