1

我正在尝试在我的 PC(Ubuntu,客户端)和我的手机(Android,服务器)之间创建一个简单的多播通信。

单播/TCP 连接正常工作,定义的端口 (37659) 在 PC 和手机上都打开。尝试使用 MulticastSocket 时,没有打开任何端口。nmap告诉我指定的端口 (36963) 是 TCP 端口并且它已关闭。(在receive执行 - 方法时)。

难道我做错了什么?还是防火墙阻止了多播套接字?(我已经尝试了大约 20 个不同的端口,但没有一个工作......,目前使用端口 36963)

编辑:同样在防火墙完全关闭的情况下,nmap 告诉我端口已关闭......

服务器的代码(电话):

private void multicastLoop() {
        String res = Build.FINGERPRINT + "\n";
        final InetAddress group;
        final MulticastSocket socket;
        final DatagramPacket response;
        try {
            group = InetAddress.getByName("224.0.0.115");
            socket = new MulticastSocket(mport);
            socket.setLoopbackMode(true);
            socket.setSoTimeout(10000);
            socket.joinGroup(group);
            response = new DatagramPacket(res.getBytes(), res.length(), group, mport);
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }

        Thread t = new Thread(new Runnable() {

            @Override
            public void run() {
                while(isRunning) {
                    try {
                        byte[] data = new byte[1024];
                        DatagramPacket dm = new DatagramPacket(data, data.length);
                        socket.receive(dm);
                        Log.d("udp", "received");
                        if (Arrays.equals(dm.getData(), "someone there".getBytes())) {
                            socket.send(response);
                        }
                    } catch (SocketTimeoutException e) {
                        continue;
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                try {
                    socket.leaveGroup(group);
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        });
        t.start();
    }

客户代码(电脑):

public String[] findServers() {
        String hello = "someone there";
        try {
            InetAddress group = InetAddress.getByName(mhost);
            MulticastSocket socket = new MulticastSocket(mport);
            socket.setLoopbackMode(true);
            socket.setSoTimeout(60000);
            socket.joinGroup(group);
            DatagramPacket p = new DatagramPacket(hello.getBytes(), hello.length(), group, mport);
            byte[] buffer = new byte[1024];
            socket.send(p);
            DatagramPacket r = new DatagramPacket(buffer, buffer.length);
            socket.receive(r);
            socket.leaveGroup(group);
            socket.close();
            String srinfo = "";
            byte[] data = r.getData();
            for (byte b: data)
                srinfo += (char) b;
            System.out.println("Server found at " + r.getAddress().getHostName() + ": " + srinfo);
        } catch (SocketTimeoutException e) {
            return new String[] {"timeout"};
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
4

2 回答 2

1

确保 mhost 设置为“224.0.0.115”而不是某些机器名称。

确保在您的路由器上启用了多播。

于 2014-01-25T07:12:01.303 回答
0
  1. 如果主机是多宿主的,您需要通过所有本地接口加入多播组,而不仅仅是默认接口,这是您目前正在做的。

  2. 您可以将响应发送回它来自的源地址,该地址位于接收到的数据报包中。这也意味着客户端不需要MulticastSocket,只需要一个DatagramSocket。

于 2014-01-23T06:02:55.287 回答