코드에 잘못된 두 가지가 있다고 생각합니다. 만약 here 패킷 구조의 사용 리틀 엔디안 정수 4 바이트 블록 (32 비트)로 볼 수있는 우선
1). 수단 : 역 블록 (here 참조).
2) 두 번째로 패킷 끝에서 null 블록 (빈 문자열 또는 null 문자)을 사용하지 않았습니다.
솔루션 :
1) 사용 : (의 ByteBuffer와 바이트 순서가) 기본 java.nio의의 java7 출신
writer.write(ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN)
.putInt(p.size).array());
writer.write(ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN)
.putInt(p.id).array());
writer.write(ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN)
.putInt(p.cmd).array());
대신 :
writer.writeInt(p.size);
writer.writeInt(p.id);
writer.writeInt(p.cmd);
과 :
ByteBuffer.wrap(<4_BLOCKS_BYTES>)
.order(ByteOrder.LITTLE_ENDIAN).getInt();
대신 :
reader.readInt();
여기서 <4_BLOCKS_BYTES>
은 크기가 4 인 바이트 배열이며 판독기에서 읽습니다.
그리고 조언을 해줄 수 있다면 글로벌 버퍼를 사용하여 보내는 것이 더 쉬울 수도 있습니다. 크기, ID, 유형, 데이터 및 빈 블록을 바이트로 포함하는 버퍼를 의미합니다. 그리고 응답을 읽을 때도 똑같이 : DataInputStream
이 available()
인 동안 버퍼를 사용하여 읽은 다음 구문 분석하십시오.
행운을 빈다.
자바 문서 링크 : java.nio의 : DataInputStream.available을 (docs.oracle.com/javase/7/docs/api/java/nio/package-frame.html) : docs.oracle.com/javase /7/docs/api/java/io/FilterInputStream.html#available()
왜 코드 블록을 질문에 붙여 넣지 마십시오. – eis