Java多播接收器无法正常工作

时间:2017-07-19 12:05:34

标签: java multicast

我想从一个多播组和端口捕获数据包。首先,我使用tcpdump命令检查数据是否被捕获。

命令 -

tcpdump -i <interface name> dst <multicast ip>

我在java中创建了一个程序,它将加入这个多播组并在控制台上打印数据。

收件人 -

public class MulticastClient {

    public static void main(String args[]) throws IOException {
        MulticastSocket socket = new MulticastSocket(<port number here>);
        //socket.setInterface(InetAddress.getByName("<local interface ip address>")); // This line makes sense or not...don't know
        socket.joinGroup(InetAddress.getByName("<multicast ip here>"));

        while (true) {
            byte ab[] = new byte[583];
            DatagramPacket packet = new DatagramPacket(ab, ab.length);
            socket.receive(packet);
            System.out.println("Got packet " + Arrays.toString(ab));
        }
    }
}

此程序无法捕获来自给定多播组和端口的数据包。

为了进行测试,我创建了一个MulticastSockerServer,它将在一个组播组和端口上发送数据。

发件人 -

public class MulticastServer {

    public static void main(String[] args) throws Exception {

        final InetAddress group = InetAddress.getByName("<multicast group ip>");
        final int port = <port number>;

        try {
            MulticastSocket socket = new MulticastSocket(9000);
            //socket.setInterface(InetAddress.getByName("<local interface ip address>"));
            socket.joinGroup(group);

            byte[] bt = new byte[100];
            byte index = 0;
            while (true) {
                Arrays.fill(bt, (byte) index++);
                socket.send(new DatagramPacket(bt, 100, group, port));
                System.out.println("sent 100 bytes");
                Thread.sleep(1 * 1000);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

如果我运行这两个程序,那么它将按照我的预期工作,数据在接收方被捕获。那么为什么接收者只能从不同的组播组ip和端口捕获数据?

任何建议都将被挪用。

1 个答案:

答案 0 :(得分:1)

我清楚了,我发现为什么java客户端没有获取数据。实际上tcpdump命令是 -

tcpdump -i <interface name> dst <multicast ip>

此命令将捕获目标地址由命令(多播ip)给出的任何数据包(即无论是UDP还是PGM)。

Java客户端仅捕获UDP数据包而不捕获PGM数据包。在我的本地网络上,只有PGM数据包可用,因此tcpdump命令将为我们提供数据,但Java客户端将不会接收任何数据。

如果你想捕获PGM数据包,那么你需要使用下面的一个 -

  1. 使用 JnetPcap 库捕获/读取任何(即UDP或PGM)数据包。
  2. 使用 Javapgm 库仅捕获pgm数据包。
  3. 使用 dumpcap 捕获数据包并将其存储在pcap文件中。
  4. 希望它有所帮助。