2011-01-04 8 views
5

私はMulticastSocketでコードを作成しています。メッセージを送信するクライアントとサーバーを持つ単純なアプリケーションを作成しようとしています。Java-Android上のMulticastSocketに関する問題

私は、サーバーを持っているコード:クライアント上

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

    } 

} 

そして、この:

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

問題は、私は両方を起動すると、何も起こらないということです。クライアントはメッセージを受け取らない。

何が悪いと思いますか?

+0

アプリの導入についていくつかお知らせください。これはネットワーク設定上の問題かもしれません。 UDPとUDP-マルチキャストは、特に同じ物理ネットワーク内で最適に動作します。 UDPマルチキャストは、上位レベルのゲートウェイによってブロックされるように構成できます。 2台の電話機のデータネットワークでこれを実行している場合、サービスプロバイダーがUDPマルチキャストトラフィックをアドホックグループに許可すると驚いています。あなたは同じホスト上の2つのエミュレータの同じ無線LANアクセスポイントのような同じ物理ネットワーク上の電話でこれを試しましたか? –

答えて

8

ディエゴ、

デフォルトでは、Android WiFiスタックはマルチキャストパケットを除外します。 http://developer.android.com/reference/android/net/wifi/WifiManager.MulticastLock.htmlをご覧ください。

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

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

    /* Process Multicast Packets */ 

    } 
+9

実際には、MulticastLock()メソッドにはpublicコンストラクタがないので、これはそのままでは機能しません。次のようにする必要があります:WifiManager wm =(WifiManager)getSystemService(Context.WIFI_SERVICE); WifiManager.MulticastLock multicastLock = wm.createMulticastLock( "mydebuginfo"); multicastLock.acquire(); (私のための情報を明確にするために、このサイトの功績:http://www.whizzosoftware.com/forums/blog/1/entry-40-android-jmdns-and-wifi-multicast-packets/) – Steve

+3

そしてこれが必要ですあなたのマニフェストでも許可されています: Steve

+0

そして、スティーブがsuper.onCreate(savedInstanceState)の前で言ったことをしなければなりません。 – pr0gg3r

0

Androidでのマルチキャストサポートは、多少の使用を願うかもしれないほど固形ではないことが表示されます:

あなたはの線に沿って何かを必要としています。 http://codeisland.org/2012/udp-multicast-on-android/

を参照してください。実際に機能するかどうかはデバイスによって異なる場合があります。 Nexus5では動作しません。

https://code.google.com/p/android/issues/detail?id=51195

関連する問題