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