2014-01-04 1 views
4

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

Вот код для сервера (работает на компьютере):

public class MulticastServer{ 

private int port; 

private boolean running = false; 

private MulticastSocket serverSocket; 

private InetAddress group; 

private String multicastAddress = "230.192.0.11"; 

public MulticastServer(int port) { 
    super(); 
    this.port = port; 
    init(); 
} 

public MusicStreamerServer() { 
    this(5500); 
} 

private void init() { 

    try { 
     group = InetAddress.getByName(multicastAddress); 
     serverSocket = new MulticastSocket(port); 
     serverSocket.joinGroup(group); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

public void start() throws IOException { 
    System.out.println("server started"); 

    if (running) 
     return; 

    running = true; 

    new Thread(new Runnable() { 

     @Override 
     public void run() { 

      byte[] buf = new byte[1024]; 

      DatagramPacket packet = new DatagramPacket(buf, buf.length, 
        group, port); 

      String msg = "msg"; 


      while (running) { 

            packet.setData(msg.getBytes(), 0, msg.length()); 


       try { 
        serverSocket.send(packet); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 

     } 
    }).start(); 

} 

public void stop() throws IOException { 
    running = false; 
} } 

Вот код для андроида клиента:

public class MainActivity extends Activity { 

private MulticastSocket socket; 

private InetAddress group; 

private String multicastAddress = "230.192.0.11"; 

private int port = 5500; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    init(); 
} 

private void init() { 

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() 
      .permitAll().build(); 

    StrictMode.setThreadPolicy(policy); 

    try { 
     group = InetAddress.getByName(multicastAddress); 
     socket = new MulticastSocket(port); 
     socket.joinGroup(group); 
     socket.setBroadcast(true); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     Log.wtf("init", e.getMessage()); 
    } 

    new Thread(new Runnable() { 

     @Override 
     public void run() { 

      WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
      WifiManager.MulticastLock multicastLock = wm 
        .createMulticastLock("mylock"); 

      multicastLock.acquire(); 

      byte[] buf = new byte[1024]; 

      while (true) { 

       try { 
        socket.receive(packet); 

        Log.d("receiver","received = " + (new String(packet.getData()))); 

       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

      } 

     } 
    }).start(); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
}} 

Я тестировал код с 2 различными устройства. Nexus4 и Nexus7 (2013) работают под управлением новейшего Android.

Может ли кто-нибудь мне помочь?

Thanks

+0

В вашей выборке Я считаю, что вам не хватает какой-то код для создания и обработки DatagramPacket , Я также хотел бы заявить, что Android может выполнять прием mulitcast; Я тестировал его на Nexus7 и других устройствах. –

+0

Удалось ли вам это решить? – Ahmed

+0

Какой сетевой интерфейс вы используете? Вай-фай? Каждый интерфейс может иметь свои причуды, чтобы оптимизировать использование батареи. – dolmen

ответ

2

Выполняет ли ваш манифест надлежащие разрешения?

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

Кроме того, вы можете играть с Дополнительными настройками в меню Wi-Fi на телефоне, как WiFi оптимизации и сохранить Wi-Fi во время сна может повлиять на вашу способность делать многоадресные.

3

Я видел, что проблема действительно непоследовательна.

Android версия: 4.2.x

На Samsung S4 активен: Multicast работает, как ожидалось.

На Samsung Note 10.1 и Nexus 4.2.3 Многоадресная рассылка работает не так, как ожидалось.

239.x.x.x не поддерживается (и, к сожалению, он используется для многоадресного телевидения ...) 224.0.0.251 работает должным образом.

Я думаю, что у них есть ошибка с маской.

Адрес многоадресной рассылки обычно | 1 1 1 0 | MULTICAST Адрес | 224.0.0.0 - 239.255.255.255

11100000.00000000.00000000.00000001 = 224.0.0.1 
    11101111.00000000.00000000.00000001 = 239.0.0.1 

Так маска должна быть 224.0.0.0/4 и не 224.0.0.0/8

+0

Ничего себе, я бы никогда не догадался, что через годы (относительно маски). Использовал адреса 239.7.7. *. Не работает. Протестировано 224.0.0.251, как вы предложили - работало! Спасибо! (Мой телефон: Motorola Atria 4G - Android 2.3.6) – briggsm