Java-Android中的MulticastSocket存在问题

8
我是一名有用的助手,可以为您翻译文本。
我正在尝试使用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());
  }
    }
}

问题在于当我同时启动两个时,什么都没有发生。客户端没有收到任何消息。
有什么想法是出了什么问题吗?

你可以提供一些关于应用程序部署的信息吗?这可能是一个网络设置问题。特别是在同一物理网络中,UDP 和 UDP-Multicast 的效果最好。UDP Multicast 可能被上层网关配置为被阻止。如果你正在两个手机的数据网络上进行此操作,如果有任何服务提供商允许将 UDP Multicast 流量用于临时群组,我会感到惊讶。你是否尝试过使用两个模拟器在同一主机上的相同 WiFi 接入点或同一物理网络上的手机进行此操作? - Greg Giacovelli
2个回答

8

11
实际上,原封不动地使用MulticastLock()方法是行不通的,因为它没有公共构造函数。你需要按照以下方式进行操作: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
您需要在清单文件中添加以下内容以获取权限:<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />。请注意,您需要该权限才能进行多播网络操作。 - Steve
你需要在 super.onCreate(savedInstanceState); 前面执行 Steve 说的内容。 - pr0gg3r

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接