특정 헤더 및 데이터 본문을 필요로하는 C 응용 프로그램과 소켓을 통해 연결하려고합니다. 그러나 해당 형식을 따르려고 할 때 여러 가지 문제가 발생합니다. 그것은 다음과 같아야합니다 :JAVA - 사용자 정의 소켓 프로토콜 작업
헤더 :
- 패킷 시작을위한 2 바이트.
- 패킷 크기와 헤더를 나타내는 4 바이트.
- 패킷 유형에 대해 1 바이트.
본문 :
- 매개 변수의 양을 나타내는 4 바이트.
각 매개 변수에 대해 하나의 블록 :
- 매개 변수 경도에 대해 4 바이트.
- 메시지 내용의 X 바이트
- 이스케이프 문자의 경우 1 바이트.
[%%] 13 00 00 00] [0] [12 00 00 00] [0B 00 00 00] [OPERATIONPERFORMED \ 0]
: 여기 서버가 기다리고 있는지의 예내가 겪고있는 문제는 PrintWriter를 통해 정보를 보내려고 할 때 상대방이 16 진 값을 실제 값 대신 ASCII 문자로 가져 오는 것입니다. ByteBuffer, DataOutputStream 및 여러 옵션을 사용하여 이미 시도해 보았지만 여전히 형식이 이상하거나 더 이상합니다.
내가 조사한 바에 따르면 엔디안이 반대로되어 올바른 바이트를 갖지만 잘못된 순서로 나타납니다.
지금 노력하고있어 구현은 다음과 같다 :
DataOutputStream stream = new DataOutputStream(socket.getOutputStream());
PrintWriter writer = new PrintWriter(socket.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// Header
stream.writeChar(37);
stream.writeChar(37);
stream.writeInt(26);
stream.writeChar('\\0');
stream.writeInt(1);
stream.writeInt(11);
stream.writeUTF("SET_PROBLE\\0");
stream.flush();
StringBuilder sb = new StringBuilder();
boolean state = true;
while (state) {
if (in.ready()) {
sb.append((char) in.read());
}
else {
if (sb.length() > 0) {
state = false;
}
}
}
System.out.println(sb.toString().trim());
}
당신이 나를 도울 수 있습니까?
미리 감사드립니다.
코드의 중요 부분을 포함하십시오 – amphibient
문자 또는 직렬화 된 객체가 아닌 * 바이트 *를 보내는 원시'OutputStream'을 사용해야합니다. –
누군가가 "텍스트"작가를 사용하고있는 것처럼 들립니다. wireshark와 같은 도구를 사용하여 전송 된 것에 대한 가정이 올바른지 확인하는 것이 좋습니다. –