MulticastSocket无法打开端口

时间:2014-01-16 21:09:25

标签: java port firewall multicast multicastsocket

我正在尝试在我的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;
    }

2 个答案:

答案 0 :(得分:1)

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

确保路由器上已启用多播。

答案 1 :(得分:0)

  1. 如果主机是多宿主,则需要通过所有本地接口加入组播组,而不仅仅是默认接口,这是您目前正在做的事情。

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