2012-11-04 42 views
8

我開發一個聊天應用程序,其中的Android客戶端將交換各自的IP的使用多播(UDP)。Android設備無法接收多播包

每個設備都會在一個單獨的線程中將其ip發送給多個客戶端(運行該應用程序的所有設備)。將會有另一個接收器線程監聽這些多播數據包。這是我的代碼。

//組播代碼。

DatagramSocket socket = new DatagramSocket(9898); 
      byte buff[] = ip.getBytes(); 
      DatagramPacket packet = new DatagramPacket(buff, buff.length, InetAddress.getByName("224.0.0.1"),9999); 
      socket.send(packet); 
      socket.close(); 

//接收機代碼

MulticastSocket socket = new MulticastSocket(9999); 
     InetAddress group = InetAddress.getByName("224.0.0.1"); 
     socket.joinGroup(group); 

     DatagramPacket packet; 

      byte[] buf = new byte[256]; 
      byte b = 'x'; //just a separator for time being 
      Arrays.fill(buf,b); 
      packet = new DatagramPacket(buf, buf.length); 
      String received= ""; 
      while(received!=null) 
      { 
       socket.receive(packet); 
       received = new String(packet.getData()); 
       received = received.substring(0,received.indexOf('x')); 
       this.setIp(received); 
       System.out.println("Address: " + received); 
      } 

     socket.leaveGroup(group); 
     socket.close(); 

的問題是每個設備打印其自己的地址。這似乎也從來不聽其他多播包(我的意思是應該打印其他IP的一樣)。我也會得到一個下面的日誌,不知道這是相關的。

11-04 23:56:17.985: I/OSNetworkSystem(603): mcastAddDropMembership interfaceIndex=0 

任何幫助將不勝感激。

回答

9

您需要在您的應用程序中獲取MulticastLock,這將允許您的應用程序接收未明確指向網絡上此設備的數據包。

權限需要:

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

樣品的編號:

// Acquire multicast lock 
WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
MulticastLock multicastLock = wifi.createMulticastLock("multicastLock"); 
multicastLock.setReferenceCounted(true); 
multicastLock.acquire(); 

//Do some mutlicast job here 
... ... 

// Once your finish using it, release multicast lock 
if (multicastLock != null) { 
    multicastLock.release(); 
    multicastLock = null; 
} 
+0

看起來這只是針對無線多播數據包。我通過互聯網進行多播(使用正常的APN,沒有WIFI)。它會繼續工作嗎? –

+0

我不認爲這是可能的Android上,看看答案[這裏](http://stackoverflow.com/questions/3068497/udp-multicast-over-the-internet)的幫助。 – yorkw

+0

謝謝,我會看看。 –

1

在IPv4的多播機器人支撐poorely實現。來自蛋糕時代的錯誤依然存在。

我遇到了一個類似的問題,我正在做一個依靠mDNS /多播進行服務發現的項目。我的Android應用程序不會訂閱多播組。我用的Ubuntu 14.04的機器上建立一個便攜式的接入點,並在其上運行的tcpdump驗證了這一點。連接到它的Android設備根本不會發出加入組所需的IGMP消息。我可以發送數據包但沒有收到它們。

我注意到,每當我加入網絡時,我都會向所有系統收到IPv6加入組消息。這促使我嘗試一個IPv6多播地址,並且工作。

較新的Android設備支持IPv6,它具有內置和強制多播支持。因此,不要使用4類IPv4多點傳送地址,而要將代碼修改爲使用IPv6地址。這將使您的代碼至少在本地級別上工作。

http://developer.android.com/reference/java/net/Inet6Address.html

這個頁面有大量有關其IP來按您的使用需求的信息。

有人說,它沒有WiFiManager.crrateMulticastLock(),但我沒有嘗試。

多播到全球網絡當然是可能的理論上。但我從來沒有見過一個成功的實際實施。鑑於遍佈全球的神祕路由器和防火牆。

這太問題說明它是如何在桌面上完成的。類似的代碼也適用於android。

IPv6 Multicast example

相關問題