2011-04-07 111 views
1

我有一個UDP廣播的行爲問題,java的UDP廣播問題

public static final int PORT = 34567; 

public static void main(String[] args) throws IOException, 
     InterruptedException { 
    if (args.length > 0 && args[0].equals("server")) { 
     int port; 
     if (args.length >= 2) { 
      port = Integer.parseInt(args[1]); 
     } else { 
      port = PORT; 
     } 

     DatagramSocket sr = new DatagramSocket(port, InetAddress.getLocalHost()); 

     while (true) { 
      byte[] buf = new byte[256]; 
      DatagramPacket pct = new DatagramPacket(buf, buf.length); 
      sr.receive(pct); 
      String s = new String(buf); 
      System.out.println(s.replaceAll("\0", "") + " " + pct.getAddress().toString()); 
     } 
    } else { 
     DatagramSocket ss = new DatagramSocket(); 
     ss.setBroadcast(true); 
     byte[] b = new byte[100]; 
     DatagramPacket p = new DatagramPacket(b, b.length); 
     p.setAddress(InetAddress.getByAddress(new byte[] { (byte) 255, 
       (byte) 255, (byte) 255, (byte) 255 })); 
     p.setPort(PORT); 

     int i = 0; 
     while (true) { 
      String s = new Integer(i++).toString(); 
      System.out.println(s); 
      b = s.getBytes(); 
      p.setData(b); 
      ss.send(p); 
      Thread.sleep(1000); 
     } 

機器A,當我運行服務器和它同時接收多個數據包的客戶,所以我下面的輸出

0 /192.168.253.5 
0 /192.168.253.5 
1 /192.168.253.5 
1 /192.168.253.5 
2 /192.168.253.5 
2 /192.168.253.5 

在其他機器上B當我這樣做時,服務器根本沒有收到任何數據包

當我運行機器A上的客戶機和機器B上的服務器時,服務器接收數據包

,當我在B機器上運行的機器A和客戶端服務器,服務器沒有收到任何數據包

我猜想,這取決於發送UDP套接字的本地地址,因爲每一臺機器連接到幾個網絡,並且本地地址是隨機選擇的(它是真的嗎?),它只向本地地址所屬的網絡發送廣播,對嗎?

如果是這樣,我怎麼能發送廣播到所有網絡電腦連接? 也爲什麼收到幾個相同的數據包(第一種情況)

回答

1

DatagramSocket的SR =新 DatagramSocket的(端口, InetAddress.getLocalHost());

將第二個參數更改爲null或省略它。你不關心你從哪個IP地址接收數據報。

p.setAddress(InetAddress.getByAddress(新 字節[] {(字節)255, (字節)255,(字節)255,(字節)255}));

廣播到255.255.255.255已被棄用約20年。使用子網特定的廣播地址。更好的是,調查組播。

1

UDP請求通常限制在當前子網(除非您的網關通過然後向前,這是不尋常的)。所以這是一個問題。

沒有收到任何UDP請求的計算機也可能有本地防火牆也阻止它。

+0

沒有防火牆,但機器A連接到多個網絡(192.168.0.123/24,192.168.159.17/24等),機器B連接到多個網絡,但它們是直接可見的,因此不涉及路由器 – 2011-04-07 23:26:09

+0

我想你需要使用組播套接字並使用組...看看@ http://www.codeproject.com/KB/IP/multicast.aspx – 2011-04-07 23:42:31