首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MulticastSocket不打开端口

MulticastSocket不打开端口
EN

Stack Overflow用户
提问于 2014-01-16 21:09:24
回答 2查看 724关注 0票数 1

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

单播/TCP连接没有任何问题,定义的端口(37659)在PC和电话上都会打开。当尝试使用MulticastSocket时,不会打开端口。nmap告诉我指定的端口(36963)是一个TCP端口,并且它已经关闭。(在执行receive-method时)。

我做错了什么吗?还是防火墙阻塞了多播套接字?(我尝试了大约20个不同的端口,但没有一个成功.,目前使用端口36963)

编辑:也和防火墙完全关闭,nmap告诉我端口关闭了.

服务器代码(电话):

代码语言:javascript
复制
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();
    }

客户代码(计算机):

代码语言:javascript
复制
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;
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-25 07:12:01

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

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

票数 1
EN

Stack Overflow用户

发布于 2014-01-23 06:02:55

  1. 如果主机是多宿主的,则需要通过所有本地接口加入多播组,而不仅仅是默认接口,这就是您目前正在做的事情。
  2. 您可以将响应发送回它来自的源地址,该地址位于接收到的数据报数据包中。这也意味着客户端不需要MulticastSocket,只需要DatagramSocket。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21172927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档