2013-03-04 2 views
2

Я разрабатываю приложение для Android, которое в некоторых случаях отправляет многоадресное сообщение. До сих пор я запускаю это на эмуляторе.Сообщение многоадресной рассылки от приложения Android к локальному серверу

На том же компьютере у меня есть сервер (а не Android, простое Java-приложение), ожидающее сообщения многоадресной рассылки, но он никогда не получает его. Когда я запускаю сервер, так как он находится на моем локальном компьютере, я запускаю его loopback-интерфейс (127.0.0.1). Должен сказать, что я сделал это с помощью обычных приложений Java, и он отлично работает.

Вот код для Android App:

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"); 
} 

Как вы можете видеть, я использую обычный DatagramSocket вместо MulticastSocket. Это работает в простых Java-приложениях, поскольку адрес сервера прослушивания 235.0.0.1:5555.

Не уверен, что код не работает, или я должен что-то сделать в эмуляторе, чтобы он мог действительно достичь моего интерфейса loopback ... Любые идеи?

Спасибо! Alex

+0

Я просто прочитал: «В зависимости от среды эмулятор может не поддерживать другие протоколы (например, ICMP, используемые для« ping »), возможно, не поддерживается. В настоящее время эмулятор не поддерживает IGMP или многоадресную рассылку . "в http://developer.android.com/tools/devices/emulator.html#connecting. Поэтому я предполагаю, что я вынужден использовать реальное устройство для этого ... – AlejandroVK

+0

Я проверил, что этот код работает прямо на реальном устройстве, поэтому это просто эмулированные устройства, которые не поддерживают многоадресные сообщения, так как наименее, еще не ... – AlejandroVK

ответ

0

127.0.0.1 на android относится к локальному хосту устройства (или эмуляторам). Чтобы достичь локального хоста вашей локальной машины, вы должны использовать 10.0.2.2.

Это обсуждается во многих разделах.

+0

Спасибо за ваш ответ, но не работает при многоадресной рассылке, я уже пробовал это, прежде чем спрашивать :) – AlejandroVK

Смежные вопросы