Java多播接收器不工作

问题描述:

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

命令 -

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和端口数据呢?

任何建议都将被占用。

+2

可以肯定的是:tcpdump调用 - 基本上你在该系统上做过一个实验,你正在运行java代码以确保你可以真正连接到多播服务器?例如防止被防火墙阻止? – GhostCat

+0

@ GhostCat-我已经检查过防火墙的状态,目前没有运行。我的java发送者和接收者工作正常,但仍然无法从服务器捕获数据多播组ip和端口 – kit

+0

您的Java客户端只显示UDP多播数据报,但您的tcpdump命令显示任何类型的多播数据报,不仅UDP数据报=>您确定你的本地网络上有UDP多播数据报吗?另一个问题:你的主机上有多个接口吗? –

我明白了,我发现为什么java客户端没有获取数据。其实tcpdump命令是 -

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

此命令将捕捉到任何数据包(即无论是UDP或PGM),其中有目的地址由指令(IP组播)给出。

Java客户端将只捕获UDP包而非PGM包。在我的本地网络上,只有PGM数据包可用,所以tcpdump命令会给我们提供数据,但Java客户端不会收到任何数据。

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

  1. 使用JnetPcap库捕获/读取任何(即UDP或PGM)的数据包。
  2. 使用Javapgm库只捕获pgm数据包。
  3. 使用dumpcap捕获数据包并将其存储在pcap文件中。

希望它有帮助。