我正在開發一個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
我剛剛讀到:「根據環境的不同,仿真器可能無法支持其他協議(例如ICMP,用於」ping「),可能不支持。目前,仿真器不支持IGMP或組播。「在http://developer.android.com/tools/devices/emulator.html#connecting。所以我想我被迫使用真正的設備來實現這個功能... – AlejandroVK 2013-03-04 11:08:05
我已經檢查過這個代碼能夠在真實設備上直接運行,所以它只是模擬設備不支持多播消息,就像最少,還沒有... – AlejandroVK 2013-03-04 16:54:29