2012-01-27 5 views
1

기본 SSDP 명령을 처리하기 위해 UDP 응답기를 개발 중입니다. 이 코드는 자동 검색을 수행하기 때문에 서버가 특정 그룹에 멀티 캐스트를 보내면 다른 모든 가입 장치는 멀티 캐스트를 보낸 호스트와 포트로 자신의 존재를 알리는 UDP 패킷을 다시 보내야합니다. 내 안드로이드 장치는 패킷을 수신하고 전송하지만 getSocketAddress() 메서드에서 SocketAddress 객체를 가져 오는 데 너무 오래 걸리므로 서버가 시간 초과되고 수신 대기 포트가 닫히고 안드로이드 장치에서 패킷을 다시받지 못합니다.getSocketAddress() 메소드로 인해 지연이 발생하여 Android에서 통신 지연이 발생합니다.

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    MulticastSocket ms = null; 
    byte[] packBuf = new byte[128]; 
    try { 
     ms = new MulticastSocket(32410); 
     ms.joinGroup(InetAddress.getByName("239.255.255.250")); 
    } catch (IOException e3) { 
     // TODO Auto-generated catch block 
     e3.printStackTrace(); 
    } 

    while (true) 
    { 
     DatagramPacket receivedPack = new DatagramPacket(packBuf, packBuf.length); 
     try { 
      ms.receive(receivedPack); 
      Log.d(TAG, "Received data"); 

     } catch (IOException e3) { 
      // TODO Auto-generated catch block 
      e3.printStackTrace(); 
     } 

     String responseStr = "HTTP/1.0 200 OK\n" + 
      "Content-Type: app\n" + 
      "Resource-Identifier: 945e7dd5913ab45f1db4f271a1620b9471fb7d4d\n" + 
      "Name: Test App\n" + 
      "Port: 8888\n" + 
      "Updated-At: 1319511680\n" + 
      "Version: 0.9.3.4-29679ad\n" + 
      "Content-Length: 23\n\n" + 
      "<message>test</message>"; 

     byte[] response = responseStr.getBytes(); 

     DatagramSocket sendSocket = null; 
     try { 
      sendSocket = new DatagramSocket(); 

     } catch (IOException e2) { 
      // TODO Auto-generated catch block 
      Log.e(TAG,"Erro",e2); 
     } 

     DatagramPacket outPack; 
     try { 
      outPack = new DatagramPacket(response, responseStr.length(), receivedPack.getSocketAddress()); 
      sendSocket.send(outPack); 
     } catch (UnknownHostException e1) { 
      Log.e(TAG,"Erro",e1); 
     } 
     catch (IOException e) { 
      Log.e(TAG,"Erro",e); 
     } 
     catch (Exception e) 
     { 
      Log.e(TAG,"Erro",e); 
     } 
    } 
} 

어떤 아이디어 :

여기 내 코드입니까? 사전에

덕분에,

FBR

답변

0

2 일이 무엇 변경할 때 발생하는

1) ... 마음에 와서 홈 오토메이션 시스템에 내장 된 자바. 우리의 단기 해결책은 대부분의 기계 및 멀티 캐스트 주소를 hosts 파일에 저장하는 것이 었습니다. 장기적으로 우리는 로컬 DNS 서버로 끝났습니다.

Java Network 스택의 어딘가에 메모리에 DNS 오류를 캐시하는 데 걸리는 매개 변수가 있습니다. 우리는 그 숫자를 10 초 대신에 5 분으로 계산했습니다.

+0

나는 제안 된 변경을했으며 효과가 있었다. 고마워요! – ForeignerBR

1

가능성이 가장 높은 문제는 getSocketAddress()가 멀티 캐스트 주소 인 또는 단지 하나 때문에 여기에 시간 초과 된 IP 주소의 DNS 이름을 해결하기 위해 노력하고 있다는 점이다 일반적인 DNS 지연.

클래스 needResolved이 동작을 제어 할 수있는 생성자 옵션이 있습니다. 불행하게도, DatagramPacket.getSocketAddress()이 false로 설정되도록 지정하는 것을 허용하지 않는다.

이 여기에서의 최근의 논의, 분명히 알려진 문제입니다 : Issue 12328: DatagramChannel - cannot receive without a hostname lookup

스레드이 안드로이드 3.0에서 수정되었습니다 제안, 안드로이드 2.0에 대한 해결 방법 중 몇 가지를 제공 할 수도 있고 할 수있다 작동하지. 귀하의 경우에는

, 당신은 0으로 needsResolved 세트를 사용해 INADDR_ANY에 InetSocketAddress 세트와 포트 0을 생성 한 다음 receivedPack을 만들 때에 그 전달 시도 할 수 있습니다. 다행히도 이이를 다시 사용하고 설정을 기억합니다.

outPack = new DatagramPacket(response, responseStr.length(), receivedPack.getSocketAddress()); 

outPack = new DatagramPacket(response, responseStr.length(), receivedPack.getAddress(), receivedPack.getPort()); 

2) 내가 가진 문제의이 종류를 가진 기억 :

관련 문제