2012-02-05 52 views
4

我正在为我的班级开发一些同级2对等应用程序,并且我被告知要让服务器发现对方,他们必须多播到他们的UDP端口1110并监听他们的UDP端口1110。下面的代码就是为了做到这一点。为了测试,我运行了两台发送和接收的服务器。但似乎没有任何工作。你认为我的问题在哪里?在Java中多播不工作

我把2个服务器放在2个不同的文件夹中。并且我将IP地址分配给了我的NIC,例如ifconfig eth0:3 192.168.0.11 netmask 255.255.255.0 up我应该如何告诉每个服务器有关新的IP地址?

BroadcastListner

class BroadcastListner implements Callable<Object> { 
    int PORT = 1110; 
    String IP = "255.255.255.255"; 
    MulticastSocket socket ; 
    DatagramPacket packet; 
    InetAddress IPAD; 
    byte data[] = null ; //////////////change size 
    int numOfNodes; 

    BroadcastListner(String IP, int numOfNodes) { 
     try { 
      this.numOfNodes = numOfNodes; 
     this.IP = IP; 
     IPAD = InetAddress.getByName(IP); 
     socket = new MulticastSocket(PORT); 
     packet = new DatagramPacket(data,data.length); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    BroadcastListner(int numOfNodes) { 
     try{ 
      this.numOfNodes = numOfNodes; 
      // this.IP = IP; 
      IPAD = InetAddress.getByName(IP); 
      socket = new MulticastSocket(PORT); 
      packet = new DatagramPacket(data,data.length); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public String call() { 
     try{ 
      socket.joinGroup(IPAD); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return ""; 
     } 

     while(true) { 
      try { 
       socket.receive(packet); 
       String str = new String(packet.getData()); 
       System.out.println(" Time signal received from"+ 
       packet.getAddress() + " Time is : " +str); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       return ""; 
      } 
     } 

     //socket.leaveGroup(IPAD); 
     //socket.close(); 
     //return ""; 
    } 
} 

BroadcastSender

class BroadcastSender implements Callable<Object> { 
    int PORT = 1110; 
    String IP = "255.255.255.255"; 
    MulticastSocket socket; 
    DatagramPacket packet; 
    InetAddress IPAD; 
    byte[] data = "IAmAServer".getBytes(); 
    //int numOfNodes; 
    String str = "IAmAServer"; 

    BroadcastSender(String IP) { 
     try { 
      // this.numOfNodes = numOfNodes; 
      this.IP = IP; 
      IPAD = InetAddress.getByName(IP); 
      socket = new MulticastSocket(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    BroadcastSender() { 
     try{ 
      // this.numOfNodes = numOfNodes; 
      // this.IP = IP; 
      IPAD = InetAddress.getByName(IP); 
      socket = new MulticastSocket(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public String call() { 
     try { 
      socket.joinGroup(IPAD); 
      socket.setTimeToLive(10); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return ""; 
     } 

     while(true) { 
      try { 
       Thread.sleep(2000); 
       packet = new DatagramPacket (data,str.length(),IPAD,PORT); 
       socket.send(packet); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       return ""; 
      } 
     } 
     //return ""; 
    } 
} 
+0

不确定是否还有其他问题,但我认为你的IP是错误的。有一些地址为多播保留。你需要选择其中的一个。例如,224.x.x.x. – Kevin 2012-02-05 16:30:11

+0

要重申@Kevin发布的内容,您不应将网络掩码用作IP地址。 – Perception 2012-02-05 16:56:00

回答

0

你需要尝试192.168.0.255的广播地址

一个替代方案是使用多播,而不是像224.xxx这样的广播地址,它不受特定的子网限制。

+0

我以前没见过使用广播地址。这与使用多播地址相同还是仅限于192.168.0.x子网? – Kevin 2012-02-05 23:02:19