2011-01-04 10 views
5

Ich fange an, mit MulticastSocket zu codieren, versuchen, eine einfache App mit einem Client und einem Server zum Senden von Nachrichten zu erstellen.Problem mit MulticastSocket auf Java-Android

Der Code, den ich für den Server haben:

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

    } 

} 

Und das auf dem 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()); 
    } 
    } 
} 

Das Problem ist, dass, wenn ich beide starten, passiert nichts. Der Client erhält keine Nachricht.

Irgendeine Idee, was ist los?

+0

Können Sie einige Informationen in die Bereitstellung der App geben? Dies könnte ein Netzwerkinstallationsproblem sein. UDP und UDP-Multicast funktionieren am besten innerhalb desselben physischen Netzwerks. UDP Multicast könnte so konfiguriert werden, dass es von den Gateways der oberen Ebene blockiert wird. Wenn Sie dies über das Datennetzwerk von zwei Telefonen tun, würde ich überrascht sein, wenn irgendein Dienstanbieter UDP-Multicast-Verkehr zu Ad-hoc-Gruppen zulassen würde. Haben Sie das mit den Telefonen im selben physikalischen Netzwerk versucht, zum Beispiel über denselben WLAN-Zugangspunkt von zwei Emulatoren auf demselben Host? –

Antwort

8

Diego,

standardmäßig die Android WiFi Stapel filtert Multicast-Pakete aus. Werfen Sie einen Blick auf http://developer.android.com/reference/android/net/wifi/WifiManager.MulticastLock.html.

Sie brauchen etwas entlang der Linien von:

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

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

    /* Process Multicast Packets */ 

    } 
+9

Eigentlich funktioniert das nicht sofort, da die MulticastLock() Methode keinen öffentlichen Konstruktor hat. Sie müssen es so machen: WifiManager wm = (WifiManager) getSystemService (Context.WIFI_SERVICE); WifiManager.MulticastLock multicastLock = wm.createMulticastLock ("mydebuginfo"); multicastLock.acquire(); (Kudos zu dieser Seite für die Klärung der Informationen für mich: http://www.whizzosoftware.com/forums/blog/1/entry-40-android-jmdns-and-wifi-multicast-packets/) – Steve

+3

Und Sie brauchen das Erlaubnis in Ihrem Manifest auch: Steve

+0

Und Sie müssen tun, was Steve vor super.onCreate (savedInstanceState) gesagt hat; – pr0gg3r