2012-08-08 4 views
0

내가 다시 클라이언트 내가 INT32 와이어에 8B의 문자를 기록 할자바 소켓 작가

PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); 

에 서버에서 정수와 문자를 작성하는 자바 소켓 프로그램을 사용하고 있습니다. 나는 그것이 "01 00 00 00"표시 할 반면 정수 나는 그것이 "30 30 30 31"로 와이어 샤크에 나타납니다

out.printf("%04x",1); 

을 쓸 때. Out.printf ("% d", 1)와 마찬가지로; "01 00 00 00"을 원하면 "31"으로 표시됩니다. 4B와 8B의 정수를 어떻게 쓸 수 있습니까? 표현은 인코딩과 관련이 있습니까?

+0

리틀 엔디안 또는 빅 엔디안 형식을 원하십니까? –

+0

문자열로 쓰고 있습니다. 0은 char 30, 1은 char 31입니다. 순서에서는 endianness가 사용됩니다. – CodeCaster

답변

2

PrintWrite를 사용하여 텍스트를 소켓에 쓰는 것은 오류를 숨기므로 이상적이지 않습니다.

당신의 경우에는 당신이 시도하는 것이 좋습니다 것이므로 이진 쓰기 싶지 나타납니다.

DataOutputStream out = new DataOutputStream(
         new BufferedOutputStream(clientSocket.getOutputStream())); 

out.writeInt(1); 

그러나 리틀 엔디안 형식을 고소하려면 NIO 차단을 사용합니다.

SocketChannel sc = 
ByteBuffer bb= ByteBuffer.allocateDirect(1024).order(ByteOrder.LITTLE_ENDIAN); 

bb.putInt(1); 
// put whatever else 
bb.flip(); 
while(bb.remaining() > 0) sc.write(bb); 
+0

DataOutputStream의 이점을 이해합니다. 그러나 어떤 이유로 든 writeInt (1) 또는 writeUTF ("Peter")도 인쇄되지 않습니다. BufferedOutputStream을 제거하면 작성됩니다. 왜 이런 일이 일어나는 지 아십니까? 게다가 하나의 호출로 int32와 char [8]을 보내는 것에 관심이 있습니다. 즉, 하나의 PDU에 연결됩니다. 페이로드가 "01 00 00 00 AA AA AA AA" –

+0

데이터를 푸시하려면 스트림을 플러시해야합니다. BufferedOutputStream을 꺼내면 속도가 느려지지만 데이터를 플러시 할 필요는 없습니다. int32와 char []를 합치려면 데이터를 버퍼링 한 다음'char [] '뒤에 플러시하십시오. –

+0

BTW : int32와 char []를 함께 전송했기 때문에 그렇게 생각할 수 없습니다 a) 하나의 read()에서이 데이터의 일부만 가져오고 b) 하나의 read()에서 여러 개의 "message"c) a와 b의 조합 –

1

예. "% 04x"및 문자열 변환을 지정하면 데이터에 대해 16 진수 인코딩을 암시 적으로 선택합니다 (즉, 숫자를 ASCII 문자열로 변환).

정수를 4 바이트로 변환하는 대신 ByteBuffer을 사용하십시오. this answer for details을 참조하십시오.

1

이진 데이터를 쓰려면 PrintWriter 또는 다른 Writer를 래퍼로 사용하지 마십시오. DataOutputStream을 대신 사용해보십시오.이 메소드는 int 등을 쓰는 메소드 세트를 제공합니다.