2011-01-04 14 views
5

Sto iniziando a codificare con MulticastSocket, cercando di creare una semplice app con un client e un server per inviare messaggi.Problema con MulticastSocket su Java-Android

Il codice che ho per il server:

import java.io.IOException; 
    import java.net.DatagramPacket; 
    import java.net.InetAddress; 
    import java.net.MulticastSocket; 
    import java.net.SocketException; 


    public class Servidor { 
private static MulticastSocket ms; 
public static void main(String[] args) throws IOException{ 

    InetAddress sessAddr = InetAddress.getByName("224.2.76.24"); 
    try{ 
    sessAddr = InetAddress.getByName("224.2.76.24"); 
     ms = new MulticastSocket(5500); 
     ms.joinGroup(sessAddr); 

     while (true) 
     { 
     byte[] mensaje = new byte[1024]; 
     mensaje = "aa".getBytes(); 
     DatagramPacket dp = new DatagramPacket(mensaje, mensaje.length,sessAddr,5500); 
     ms.send(dp); 
     } 
     } 
     catch (SocketException se) { 
     System.err.println(se); 
     } 

     ms.leaveGroup(sessAddr); 

    } 

} 

E questo sul client:

package com.example; 
    import java.io.IOException; 
    import java.net.DatagramPacket; 
    import java.net.InetAddress; 
    import java.net.MulticastSocket; 
    import java.net.UnknownHostException; 

    import android.app.Activity; 
    import android.os.Bundle; 
    import android.widget.EditText; 
    import android.widget.TextView; 

    public class ClienteMultiCast extends Activity { 
    /** Called when the activity is first created. */ 


    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     TextView Mensaje; 
     Mensaje =(TextView)findViewById(R.id.Mensaje); 


     InetAddress ia = null; 
     byte[] buffer = new byte[65535]; 
     MulticastSocket ms = null; 
     int port = 5500; 
     try { 
     ia = InetAddress.getByName("224.2.76.24"); 
     DatagramPacket dp = new DatagramPacket(buffer, buffer.length,ia,port); 
     ms = new MulticastSocket(port); 
      ms.joinGroup(ia); 
      while (true) { 
       ms.receive(dp); 
       String s = new String(dp.getData(),0,dp.getLength()); 
       Mensaje.setText(s); 
      } 

      } catch (UnknownHostException e) {Mensaje.setText(e.getMessage());} catch (IOException e) {Mensaje.setText(e.getMessage()); } 

      try { 
      ms.leaveGroup(ia); 
      } catch (IOException e) { 
      Mensaje.setText(e.getMessage()); 
    } 
    } 
} 

Il problema è che quando inizio sia, non succede nulla. Il client non riceve alcun messaggio.

Qualche idea di cosa c'è che non va?

+0

Potrebbe fornire alcune informazioni sulla distribuzione dell'app? Questo potrebbe essere un problema di installazione di rete. UDP e UDP-Multicast funzionano in modo specifico nella stessa rete fisica. UDP Multicast potrebbe essere configurato per essere bloccato dai gateway di livello superiore. Se lo stai facendo sulla rete dati di due telefoni, sarei sorpreso se qualche fornitore di servizi consentisse il traffico multicast UDP ai gruppi ad hoc. Hai provato questo con i telefoni sulla stessa rete fisica come sopra lo stesso punto di accesso wifi di due emulatori sullo stesso host? –

risposta

8

Diego,

Per impostazione predefinita, lo stack WiFi Android filtra i pacchetti multicast. Dai uno sguardo allo http://developer.android.com/reference/android/net/wifi/WifiManager.MulticastLock.html.

avete bisogno di qualcosa sulla falsariga di:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    /* Turn off multicast filter */ 
    MulticastLock mcastLock = new MulticastLock(); 
    mcastLock.acquire(); 

    /* Process Multicast Packets */ 

    } 
+9

In realtà, non funzionerà immediatamente, poiché il metodo MulticastLock() non ha un costruttore pubblico. È necessario farlo in questo modo: WifiManager wm = (WifiManager) getSystemService (Context.WIFI_SERVICE); WifiManager.MulticastLock multicastLock = wm.createMulticastLock ("mydebuginfo"); multicastLock.acquire(); (Complimenti a questo sito per chiarire le informazioni per me: http://www.whizzosoftware.com/forums/blog/1/entry-40-android-jmdns-and-wifi-multicast-packets/) – Steve

+3

E hai bisogno di questo anche nel tuo manifest: Steve

+0

E devi fare ciò che Steve ha detto di fronte a super.onCreate (savedInstanceState); – pr0gg3r