2011-04-07 123 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