2016-10-23 3 views
1

내 앱이 브로드 캐스트 메시지를 수신 할 수 있도록 구현하려고합니다. 하나의 장치가 192.168.2.255에 메시지를 보냅니다. 나는 이것이 작동한다는 것을 Wireshark에서 볼 수 있습니다. 내 응용 프로그램은 이러한 메시지를 받아야하지만 아직 작동하지 않습니다. 이것은 내 코드입니다 :android에서 브로드 캐스트 패킷을받는 방법

int port = 3123; 

     // Create a socket to listen on the port. 
     DatagramSocket dsocket = new DatagramSocket(port); 
     dsocket.setBroadcast(true); 

     // Create a buffer to read datagrams into. If a 
     // packet is larger than this buffer, the 
     // excess will simply be discarded! 
     byte[] buffer = new byte[1024]; 

     // Create a packet to receive data into the buffer 
     DatagramPacket packet = new DatagramPacket(buffer, buffer.length); 

     // Now loop forever, waiting to receive packets and printing them. 
     while (true) { 
     // Wait to receive a datagram 
      dsocket.receive(packet); 

      // Convert the contents to a string, and display them 
      String msg = new String(buffer, 0, packet.getLength()); 
      System.out.println(packet.getAddress().getHostName() + ": " + msg); 

      // Reset the length of the packet before reusing it. 
      packet.setLength(buffer.length); 

      res = msg; 

      Log.d("mainGate_bc", res); 
     } 
    } catch (Exception e) { 
      System.err.println(e); 
    } 

프로그램이 dsocket.receive (packet) 행에 고정되어 있습니다. 다른 장치가 패킷을 보내는 동안 앱에 아무 것도 도착하지 않습니다.

이 권한은 시도 :

<uses-permission android:name="android.permission.INTERNET"></uses-permission> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 

어떤 생각이 왜 작동하지 않는 이유는 무엇입니까? 추가 권한? Android 기기의 설정은 무엇인가요?

+0

감사하지만 같은 결과 :

그래서 다음과 같은 코드가 필요합니다. – user3137385

+0

코드가'receive()'에 대한 블로킹 호출을 극복합니까? 그렇지 않다면주기적인 인터럽트를 만들기 위해 [여기]를보십시오 (http://stackoverflow.com/questions/40055175/how-to-interrupt-a-blocking-call-to-udp-sockets-receive/40055466#40055466). 차단 통화. – Onik

+0

그렇지 않습니다. 그러나 나는 또한 수신을 방해하고 싶지 않습니다. 내 앱에 도착하지 않는 기존 메시지를 받고 싶습니다. – user3137385

답변

1

이 질문은 this other question. 의 중복입니다. 멀티 캐스트 잠금을 획득하지 않으면 명백하게 브로드 캐스트 패킷이 모두 필터링됩니다.

WifiManager wm = null; 
MulticastLock multicastLock = null; 

@Override 
protected void onResume() { 
    super.onResume(); 
    if(wm == null)wm = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
    if(multicastLock == null){ 
     multicastLock = wm.createMulticastLock("stackoverflow for the win"); 
     multicastLock.setReferenceCounted(true); 
    } 
    if(multicastLock != null && !multicastLock.isHeld()) multicastLock.acquire(); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    if(multicastLock != null && multicastLock.isHeld()) multicastLock.release(); 
} 


<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> 
관련 문제