201005230252

Java netwokr programming issue

수업 프로젝트 테스팅&디버깅을 하는 중 알아낸 점.

Java의 networking 지원 클래스 중 하나인 InetAddress class에는 호스트의 local address를 구해주는 getLocalHost()라는 메소드가 있다. 서버 쪽에 이 메소드를 써서 udp 소켓을 만들고 클라이언트에서 접속을 하는 코드인데,

이상하게도 윈도우에서 잘 돌아가는 코드가 우분투에서 안돌아가는 거다. 처음엔 우분투 자체의 방화벽 설정이 되어 있나 싶었지만 확인결과 아님.

원인은 Java의 getLocalHost() 메소드 자체가 loopback address를 리턴하고 있었다. 좀 더 찾아보니 SecurityManager에 설정된 값에 따라 loopback address를 반환하는 듯. 윈도우와 우분투의 설정 차이인 듯 싶다.

코드 내에서 SecurityManager 설정을 바꾸는 방법은 (현재까지 지식으론) 없는 듯 하고, 어쩔 수 없이 불편하지만 사용자가 설정하도록 코드를 수정했다. 자동으로 할 수 있는 방법이 없진 않지만, Java의 network class들이 multiple interface 환경에서 제대로 동작하지 않을 위험이 있어서 포기. 아직 지원이 잘 안되는 것 같다.

결국 이런 코드를

rp_addr = new InetSocketAddress(InetAddress.getLocalHost(), local_port);

이렇게 바꿨다.

rp_addr = new InetSocketAddress(configured_local_addr, local_port);            // configuration code는 별도

CS나 플밍 경험이 있는 사람 아니면 이게 뭥미…할 얘긴데, 저 문제로 어제 하루를 거의 날린 듯 하여 울적했기 때문에 잊지 않기 위해서 써둔다. 왜 진작 서버쪽 코드를 체크할 생각을 안했을까…

  • 2010/05/23 02:52 에 작성

results matching ""

    No results matching ""