2013-08-22 2 views
0

잠시 동안이 문제에 곤란을 겪었고 내 머리카락을 떠났습니다.중첩 된 파이썬을 인코딩하는 방법 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) 
+0

왜 상태 코드가 부동 상태입니까? 그리고'rpc_pb2.OK'를 어딘가에 정의 할 필요가 있습니까? – user2357112

+0

눈이 좋습니다. 게시물이 이미 너무 길어서 rpc_pb2.OK를 빠뜨릴 까봐 두려웠습니다. 여기에 enum StatusCd { // 서버 측 오류 OK = 1; ... } 또한 상태 코드가 부동되어서는 안됩니다 ... 오류가 발생했습니다. – JeffSpicoli

+0

클라이언트와 서버가 호환되는 .proto 파일을 사용하고 있습니까? 어쩌면 필드 유형이 달라 지거나 다를 수 있습니다. – user2357112

답변

관련 문제