2011-12-12 117 views
5

我正在用Java编写一个类,用于大大简化组播过程。然而,我有两个大问题:Java组播发送数据,未收到

  1. 该类发送数据(我可以验证这与我的网络监视器,Wireshark),但数据不被任何其他人在同一组接收。
  2. 在某些机器上,发送数据包的TTL超过了传输范围(同样根据Wireshark)。

任何人都可以帮我吗?我一直在尝试搜索几个小时的答案,而且看起来我的代码遵循了从多播主机连接,加入,发送和接收数据的所有基本过程。

下面是类的相关部分的一个片段:

多路广播类:

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()); 
+0

你可以参考我的意见,因为这个问题涉及到[http://stackoverflow.com/questions/8471447/java-multicast-sample-program-is-unable-to-deliver-packets-within-lan-横跨ho](http://stackoverflow.com/questions/8471447/java-multicast-sample-program-is-unable-to-deliver-packets-within-lan-across-ho) – ecle

回答

6

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

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

socket.joinGroup(socketAddress, networkInterface); 

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

+0

你能给我一个建议吗关于https://stackoverflow.com/questions/45162552/multicast-receiver-unable-to-capture-the-data我的问题? – kit