Java多播发送数据,未接收

我正在用Java编写一个类,用于大大简化多播过程。 但是,我遇到两个大问题:

  1. 该类发送数据(我可以使用我的网络监视器Wireshark进行validation),但同一组中的任何其他人都不会收到数据。
  2. 在某些机器上,传输过程中超出了发送数据包TTL(同样,根据Wireshark)。

有人可以帮帮我吗? 我一直在努力寻找几小时的答案,看来我的代码遵循了从多播主机连接,加入,发送和接收数据的所有基本过程。

以下是该课程相关部分的片段:

Multicaster类:

public class Multicaster { public int port = 5540; protected String IPAddress; private MulticastSocket msConn; private InetAddress netAddr; public Multicaster(String IPAddress) { this.IPAddress = IPAddress; } public String recieveData() { byte[] buf = new byte[1000]; DatagramPacket pack = new DatagramPacket(buf, buf.length); try { this.msConn.receive(pack); new Message(pack); String out = new String(pack.getData()); return out.substring(0, pack.getLength()); } catch (IOException e) { return new String(""); } } public void joinGroup() { try { this.msConn.joinGroup(this.netAddr); } catch (IOException e) { //This error shouldn't occur since it would caught by the connect() method during initial connection to the host } } public void connect() throws MulticasterInitException { //Try to create a multicast connection on the given IP address and port try { try { //Create a multicast connection on a given port, throws UnknownHostException this.msConn = new MulticastSocket(this.port); //If all goes well, then create a connection to a given IP address using the above port number, throws IOException and SecurityException this.netAddr = InetAddress.getByName(this.IPAddress); } } /** * Here all of the possible exceptions that are thrown above * are caught and handled here. This works just fine. */ } public void sendData(String data) throws MulticasterSendException { DatagramPacket packet = new DatagramPacket(data.getBytes(), data.length(), this.netAddr, this.port); try { this.msConn.send(packet); } catch (IOException e) { throw new MulticasterSendException("Java could not communicate with the server. Please check your network connections.", e); } } } 

发送数据的示例用法:

 Multicaster multicast = new Multicaster("239.0.0.0"); try { multicast.connect(); } catch (MulticasterInitException e) { //Handle exception... } multicast.joinGroup(); try { multicast.sendData("Hi"); } catch (MulticasterSendException e) { //Handle exception... } 

用于接收数据的示例用法:

 Multicaster multicast = new Multicaster("239.0.0.0"); try { multicast.connect(); } catch (MulticasterInitException e) { //Handle exception... } multicast.joinGroup(); System.out.print(multicast.recieveData()); 

我以前遇到过类似的问题,必须确保在接收端指定了NetworkInterface。

 SocketAddress socketAddress = new SocketAddress(groupIp, groupPort); NetworkInterface networkInterface = NetworkInterface.getByName(interfaceName); socket.joinGroup(socketAddress, networkInterface); 

其中interfaceName是在Linux或Mac上运行ifconfig时显示的接口名称之一。