2013-03-04 51 views
2

我正在開發一個Android應用程序,它在某些時候發送多播消息。到目前爲止,我正在模擬器上運行此操作。從Android應用程序到本地服務器的多播消息

在同一臺機器上,我有一個服務器(不是Android,一個普通的Java應用程序),它期望多播消息,但它永遠不會得到它。當我啓動服務器時,由於它位於本地計算機上,因此我將它啓動爲回送接口(127.0.0.1)。我必須說,我已經用普通的Java應用程序完成了它,並且它完美地工作。

下面是Android應用程序的代碼:

try { 
    InetAddress group = InetAddress.getByName(MULTICAST_HOST); 
    byte[] data = DISCOVER_MESSAGE.getBytes(); 
    DatagramSocket ds = new DatagramSocket(); 
    ds.setSoTimeout(60000); 
    DatagramPacket dp = new DatagramPacket(data, data.length, group, TcpipSIBDiscoverer.PORT); 

    ds.send(dp); 
    byte[] buf = new byte[1024]; 
    dp = new DatagramPacket(buf, buf.length); 
    ds.receive(dp); 
    if (dp.getLength() > 0) { 
     byte[] tmp = new byte[dp.getLength()]; 
     System.arraycopy(dp.getData(), 0, tmp, 0, tmp.length); 
     String received = new String(tmp); 
     Logger.debug(this, "Received from SIB: " + received); 
     SIBDescriptor sibDescriptor = createSIBDescriptor(received); 

     this.discoveryListener.connectorSIBDiscovered(sibDescriptor); 
    } 
} catch (SocketTimeoutException e) { 
    Logger.error("Socket time excedeed while waiting a response when discovering SIBs. Trying again"); 
} catch (IOException e) { 
    Logger.error("There was some kind of IO error while waiting for a response when discovering SIBs. Trying again"); 
} 

正如你所看到的,我使用的MulticastSocket定期DatagramSocket來代替。這在純Java應用程序中工作,因爲偵聽服務器地址是235.0.0.1:5555

不能確定代碼是否工作不正常,或者我必須在模擬器設備中執行某些操作,以便它可以真正到達我的環回接口......任何想法?

謝謝! Alex

+0

我剛剛讀到:「根據環境的不同,仿真器可能無法支持其他協議(例如ICMP,用於」ping「),可能不支持。目前,仿真器不支持IGMP或組播。「在http://developer.android.com/tools/devices/emulator.html#connecting。所以我想我被迫使用真正的設備來實現這個功能... – AlejandroVK 2013-03-04 11:08:05

+0

我已經檢查過這個代碼能夠在真實設備上直接運行,所以它只是模擬設備不支持多播消息,就像最少,還沒有... – AlejandroVK 2013-03-04 16:54:29

回答

0

android上的127.0.0.1引用設備的localhost(或模擬器)。 要訪問本地機器的本地主機,您應該使用10.0.2.2。

這在很多話題中都有討論。

+0

感謝您的迴應,但無論如何在使用多點傳送時都不起作用,我在嘗試之前已經嘗試了:) – AlejandroVK 2013-03-04 12:57:01

相關問題