반응형

예를 들어서 안드로이드 클라이언트가 다른 외부 서버랑 연결해서 소켓 연결 후 통신을 주고 받는데,

 

아스키코드를 주고 받을 때는 문제가 없지만 한글을 주고 받을 때는 깨지는 현상이 생깁니다.

 

이것은 인코딩과 관련된 문제로 주고 받을 때 클라이언트쪽에서 송수신할 때에 아래와 같이 처리를 해주면 됩니다.

 

보통 Buffered 객체를 많이 쓰므로 이것으로 예를 들겠습니다.

 

//소켓 연결 처리.

SocketAddress remoteAddr=new InetSocketAddress("127.0.0.1",1234);

Socket socket=new Socket();

socket.connect(remoteAddr); //remoteAddr

 

//Buffered 객체 연동.

BufferedOutputStream out=new BufferedOutputStream(socket.getOutputStream()); //output stream

BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream(),"EUC_KR")); //input stream.

 

위 코드를 보면 out은 서버로 데이타를 내보낼 때 쓰고, in은 서버에서 데이타를 받을 때 씁니다.

Reader 객체 생성시 EUC_KR를 주게 되면 서버에서 받는 데이타는 한글이라도 깨지지 않습니다.

 

전송할 때는

 

String data="한글테스트\n";

out.write(data.getBytes("EUC_KR"));

 

이와 같이 EUC_KR 로 인코딩하여 전송하면 해결됩니다.

 

간단한 내용이지만 이것으로 헤매는 분들이 계시기에 올려둡니다...

 

반응형
반응형

 

처음에 안드로이드로 TCP 소켓 통신시 겪었던 문제입니다.(자바를 이용한 모든 TCP 소켓 통신에도 해당)

 

C++로 개발한 더미 클라이언트를 통해 서버 PC로 데이타를 무한히 날리면 일정한 속도로 잘 날아가는데,

 

안드로이드에서 해당 더미 클라이언트를 구현하여 데이타를 무한히 날리니 빨리 전송되다가 느리게 전송되다가

 

송신 속도가 일정치 않고 왔다갔다하는 현상이 나타났습니다.

 

확인 결과 NAGLE 알고림즘이 적용되있었기 때문입니다.

 

socket 클래스의 메소드 중에 setTCPNoDelay(boolean on) 함수가 존재하는데 이것을 true로 설정 후 송신하게 되면

 

버퍼링 없이 바로바로 데이타가 송신됩니다. 참고로 default는 false입니다.

 

※ NAGLE 알고리즘은 데이타를 효율적으로 송신하기 위한 알고리즘인데, 송신시에 일정량의 데이타를 버퍼에 모아놓았다가 한꺼번에 보내는 방식입니다. 게임 같이 실시간으로 패킷이 왔다갔다해야하는 경우는 적합하지 않겠죠.

반응형

+ Recent posts