2014-09-30 4 views
0

저는 밸브 rcon 프로토콜을 사용하는 Minecraft 용 RCON을 구현하고 있습니다. C 소스를 손에 쥐고 Java로 구현하려고했습니다. 이것이 제가 한 것입니다. 지금까지 수행 : http://pastebin.com/9AeiSQPDRCON을 Java로 변환

받으십시오 패킷 : 나는 AUTH 패킷 t을 보내고있다 http://pastebin.com/rixhD15p

: http://pastebin.com/n6V1KnPa

가 패킷을 보내기

는 패킷 만들기 응답을 수신하기 위해 노력하고 있지만, 반환 값이 null 서버 O 및, 또한 명령을 보내려고하면 발생합니다 : 내가 잘못 뭘

를 소켓 쓰기 오류 :

소프트웨어는 연결 중단 발생 ?

+0

왜 코드 블록을 질문에 붙여 넣지 마십시오. – eis

답변

1

코드에 잘못된 두 가지가 있다고 생각합니다. 만약 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, 유형, 데이터 및 빈 블록을 바이트로 포함하는 버퍼를 의미합니다. 그리고 응답을 읽을 때도 똑같이 : DataInputStreamavailable() 인 동안 버퍼를 사용하여 읽은 다음 구문 분석하십시오.

행운을 빈다.

자바 문서 링크 : 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()

+0

null 블록을 추가하면됩니다. – user1126068