A小涛涛 2013-07-05 04:12 采纳率: 0%
浏览 2353

Java广播相关问题,我到底应该使用什么广播地址才可以发送广播消息。谢谢

 网上查询关于JAVA广播的问题,关于广播地址有一些问题。有的人说广播地址是D类地址,有人说广播地址是当前ip地址最后一位换成255,有人说广播地址是全部为255的地址,现在测试结果如果全部是255在本机发送广播本机可以收到,其他的D类地址无法收到TTL已经设置为128,最后一个换成255的会被MultiScoketCast抛出不是多播地址的异常。请问他们之间有什么区别和联系各个的用法又是如何。

现在问题:我当前ip地址10.13.242.116.使用相关类MulticastSocket。测试结果:
当我使用D类地址进行广播,可以发送但是无法接收。设置可以发回本机,本机无法收到广播包。其他机器也无法收到广播包。其他机器均为10.13.*.*
当我使用本机地址最后一个字节全部变为255的时候例如:10.13.242.255此时抛出此地址不是广播地址的异常,无法发送。
当我使用全1的地址发送广播的时候例如:255.255.255.255此时本机可以收到广播包但是其他机器无法收到广播包.不知道为什么.谢谢各位的帮助.下面贴出我的最后一种实验的代码.
发送者
`import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.sql.Date;

public class MulticastSender extends Thread {
private int port = 9898;
private InetAddress ipaAddress = null;
MulticastSocket msocket;
MulticastSender(){
try {

        ipaAddress = InetAddress.getByName("255.255.255.255");
        msocket = new MulticastSocket(port);
        msocket.setBroadcast(true);
        msocket.setTimeToLive(1);
        msocket.joinGroup(ipaAddress);
    } catch (Exception e) {
        // TODO: handle exception
    }
}
@Override
public void run(){
    while(true)
    try {
        String string="Hello";
        byte [] buf = string.getBytes();
        DatagramPacket datagramPacket = new DatagramPacket(buf, 0, buf.length, ipaAddress, port);
        System.out.println("发送数据");
        msocket.send(datagramPacket);
        System.out.println("发送成功");
        Thread.sleep(2000);
    } catch (Exception e) {
        // TODO: handle exception
    }
}
public static void main(String[] args) throws Exception {  
    MulticastSender msMulticastSender = new MulticastSender();
    msMulticastSender.start();
}  

} `
接受者
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.UnknownHostException;

public class MulticastReciever extends Thread{

private int port = 9898;
private InetAddress ipgroupAddress =null;
private MulticastSocket msMulticastSocket = null;
DatagramPacket datagramPacket = null;
MulticastReciever(){
try {
msMulticastSocket = new MulticastSocket(port);
//ipgroupAddress = InetAddress.getByName("10.13.255.255");
//msMulticastSocket.joinGroup(ipgroupAddress);
byte[] data = new byte[4096];
datagramPacket = new DatagramPacket(data, data.length);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run(){
try {
while (true) {
msMulticastSocket.receive(datagramPacket);
System.out.println("接收到数据"+new String(datagramPacket.getData()));
}

} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

}
public static void main(String[] args) throws Exception {
MulticastReciever multicastReciever = new MulticastReciever();
multicastReciever.start();
}

}

这种情况下我本机可以收到广播内容,但是其他机器10.13.*.*无法收到广播包。谢谢

  • 写回答

1条回答

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-01-01 21:05
    关注

    在发送广播数据时,您可以使用两种不同的方法:


    使用 D 类地址。在这种情况下,您可以在同一子网内的所有计算机之间发送广播数据,但是不能跨越子网边界。例如,如果您的 IP 地址为 10.13.242.116,那么您可以使用 10.13.242.255 作为广播地址。


    使用全 1 地址(255.255.255.255)。在这种情况下,您可以在整个局域网内的所有计算机之间发送广播数据,但是不能跨越路由器。


    在您的代码中,您使用的是全 1 地址,因此可以发送数据,但是可能无法在其他子网内的计算机上接收数据。如果要在整个局域网内的所有计算机之间发送广播数据,则可能需要使用路由器进行转发。


    如果您希望在同一子网内的所有计算机之间发送广播数据,则可以使用 D 类地址。但是,请注意,您无法使用本机地址最后一个字节全部变为 255 的地址,因为这样的地址并不是合法的广播地址。

    评论

报告相同问题?

悬赏问题

  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 matlab有关常微分方程的问题求解决
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法