【问题标题】:Android can not receive multicast packetAndroid无法接收多播数据包
【发布时间】:2014-01-04 12:32:22
【问题描述】:

我在玩多播套接字。我编写了一个向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。

有人可以帮我吗?

谢谢

【问题讨论】:

  • 在您的示例中,我相信您缺少一些用于 DatagramPacket 创建和处理的代码。我还想说明一个事实,Android 可以进行多播接收;我已经在 Nexus7 和其他设备上测试过了。
  • 你解决了吗?
  • 你使用什么网络接口?无线上网?每个界面都可能有其怪癖,以优化电池使用。

标签: android multicast


【解决方案1】:

我已经看到这个问题确实不一致。

安卓版本:4.2.x

在三星 S4 上激活: 多播按预期工作。

在三星 Note 10.1 和 Nexus 4.2.3 上 多播未按预期工作。

239.x.x.x 不受支持(遗憾的是,它是用于多播电视的...) 224.0.0.251 正在按预期工作。

我认为他们的面具有问题。

多播地址通常是 |1 1 1 0|多播地址 | 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

【讨论】:

  • 哇,多年来我永远都不会猜到这一点(关于面具)。正在使用 239.7.7.* 地址。不工作。按照您的建议测试了 224.0.0.251 - 有效!谢谢! (我的手机:摩托罗拉 Atria 4G - Android 2.3.6)
【解决方案2】:

您的清单是否请求适当的权限?

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

此外,您可能希望在手机上使用 WiFi 菜单中的高级设置,Wi-Fi 优化和在睡眠期间保持 Wi-Fi 开启可能会影响您进行多播的能力。

【讨论】:

  • 将该行添加到 Android XML 但仍然无法正常工作。谁能详细说明在 Android 上启用 wifi 多播所需的其他配置?
猜你喜欢
  • 2022-11-02
  • 1970-01-01
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-19
  • 1970-01-01
相关资源
最近更新 更多