2011-03-09 3 views
0

Java 클라이언트에서 C++ 서버로 프로토콜 버퍼 메시지를 보내려고합니다. 서버와 클라이언트를 실행 한 후에 Api 필드의 값으로 "0"을 얻습니다. 심지어 자바 클라이언트 측에서 "1"로 설정합니다.Java 클라이언트에서 C++ 서버로 프로토콜 버퍼 메시지 보내기

public static void main(String[] args) throws IOException { 

    Socket echoSocket = null; 
    PrintWriter out = null; 
    BufferedReader in = null; 

    //the protocol buffers message is called INFO and have only one field Api 

    INFO info = INFO.newBuilder()  

      .setApi(1)     

      .build(); 

    try { 
    echoSocket = new Socket("localhost", 30000); 
    out = new PrintWriter(echoSocket.getOutputStream(), true); 
    in = new BufferedReader(new InputStreamReader(
            echoSocket.getInputStream())); 
    } catch (UnknownHostException e) { 
     System.err.println("Don't know about host: Localhost."); 
     System.exit(1); 
    } catch (IOException e) { 
     System.err.println("Couldn't get I/O for " 
          + "the connection to: Localhost."); 
     System.exit(1); 
    } 


    out.println((info.toByteArray())); // serialize and the message 
    System.out.println("send "); 
    } 
    } 

을 그리고 C++ 서버 코드는 다음과 같습니다 :

자바 클라이언트 코드는 다음과 같습니다

int main (int argc, int argv[]){ 


INFO info; 

try 
{ 
    // Create the socket 
    ServerSocket server (30000); 


    while (true) 
      { 


    ServerSocket new_sock; 
    server.accept (new_sock); 

    try 
    { 


     while(true){ 

     std::string data; 

    // in the next i'll i receive Data from the Java client i already test it with a string, and it works 

     new_sock >> data;     

     info.ParseFromString(data); 

     cout << "api: " << info.api() << endl;    

     } 
    } 

    catch (SocketException&) {} 
      } 

    } 
     catch (SocketException& e) 
     { 
    std::cout << "Exception was caught:" << e.description() << "\nExiting.\n"; 
} 

    return 0; 
    } 

내가 뭘 잘못 모르겠습니다. 내가 구문 분석을 올바르게 직렬화하는지 알 수 없습니다. 나는 잘못된 Api 값만을 얻었습니다. 문제가 있으면 알려주세요! 고마워요!

new_sock >> data; 

data에 대한 읽을 바이트 수 info.toByteArray()의 크기와 동일한 지 확인합니다

+1

디버그 메시지를 추가하여 전송하는 바이트 수를 실제로 확인해야합니다. 나는 "new_sock >> 데이터;"라고 생각하지 않는다. 줄 바꿈 및 '\ 0'문자가 올바르게 작동합니다. ProtoBuf 메시지에는 자체 길이에 대한 정보가 없습니다. 원시 소켓을 통해 메시지를 보낼 때 상대방에게 먼저 다음 메시지의 길이를 알려줘야합니다. CodedInputStream 및 CodedOutputStream 프로토 타입을 살펴 봐야합니다. –

답변

0

나는 문제로 생각합니다. 내 생각에 그들은 다르다. 어떤 경우에는 read(2) 데이터를 new_sock (기본값으로 줄 바꿈 된 구분 된 IO?)에서 바꾸는 것이 필요하다.