当前位置: 首页 > 面试题库 >

Java DatagramSocket将数据包发送到255.255.255.255失败

景俊拔
2023-03-14
问题内容

我正在用Java编写一个网络程序,我想将一些数据包发送到255.255.255.255,但是即使将它们发送到192.168.1.255(根据ifconfig命令的输出,它是广播地址)也失败了。但是,当我将它们发送到我伴侣的IP时,它可以正常工作。

这是我程序的代码:

public class StackOverFlow {
    public static void main(String[] args) {
        Network net= new Network();

        Scanner input= new Scanner(System.in);
        while(input.hasNext())
          net.sendMessage(input.nextLine());
    }
}

我已经使用DatagarmSocket和DatagramPacket做到了,这是我对Network的实现:

class Network {
DatagramSocket socket;

public Network() {
    try {
        socket = new DatagramSocket(8027);
        socket.connect(InetAddress.getByName("255.255.255.255"), 8027);
    } catch (Exception e) {
        System.err.println("Connection failed. " + e.getMessage());
    }
    listen();
}

public void listen() {
    new Thread() {
        public void run() {
            while (true) {
                try {
                    byte[] buf = new byte[1000];
                    DatagramPacket packet = new DatagramPacket(buf,
                            buf.length);
                    socket.receive(packet);
                    String message = new String(buf);
                    System.out.println("Recieved: " + message);
                    if (message.equals("end"))
                        return;
                } catch (Exception e) {
                    System.err.println(e.getMessage());
                }
            }
        }
    }.start();
}

public void sendMessage(String message){
    byte[] buf= message.getBytes();

    DatagramPacket packet= new DatagramPacket(buf, buf.length);
    try{
        socket.send(packet);
    }catch(Exception e){
        System.err.println("Sending failed. " + e.getMessage());
    }
}

没有异常被抛出。
我在一个临时网络中。
我的伴侣正在使用kubuntu 11.04时,我正在使用MAC OS X 10.6。这是ifconfig输出:

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
inet6 ::1 prefixlen 128 
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 
inet 127.0.0.1 netmask 0xff000000 
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
stf0: flags=0<> mtu 1280

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet6 fe80::21f:f3ff:fed5:4779%en0 prefixlen 64 scopeid 0x4 
inet 192.168.1.1 netmask 0xffffff00 broadcast 192.168.1.255
ether 00:1f:f3:d5:47:79 
media: autoselect (100baseTX <full-duplex>) status: active
supported media: autoselect 10baseT/UTP <half-duplex> 10baseT/UTP <full-duplex> 10baseT/UTP     <full-duplex,hw-loopback> 10baseT/UTP <full-duplex,flow-control> 100baseTX <half-    duplex> 100baseTX <full-duplex> 100baseTX <full-duplex,hw-loopback> 100baseTX <full-duplex,flow-control> 1000baseT <full-duplex> 1000baseT <full-duplex,hw-loopback> 1000baseT <full-duplex,flow-control> none

en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet6 fe80::21d:4fff:feff:2b4d%en1 prefixlen 64 scopeid 0x5 
inet 213.233.170.97 netmask 0xfffffc00 broadcast 213.233.171.255
ether 00:1d:4f:ff:2b:4d 
media: autoselect status: active
supported media: autoselect

fw0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 2030
lladdr 00:21:e9:ff:fe:bc:79:b2 
media: autoselect <full-duplex> status: inactive
supported media: autoselect <full-duplex>

en2: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether 00:1f:f3:b6:2c:be 
media: autoselect status: inactive
supported media: none autoselect 10baseT/UTP <half-duplex>

vmnet1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 192.168.149.1 netmask 0xffffff00 broadcast 192.168.149.255
ether 00:50:56:c0:00:01

vmnet8: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 192.168.73.1 netmask 0xffffff00 broadcast 192.168.73.255
ether 00:50:56:c0:00:08

en0是我用来连接伴侣的设备。

请简化一下,我是新手:)

提前致谢。


问题答案:

使用广播时,您需要启用它

socket.setBroadcast(true);

另一件事是,如果两台计算机位于两个不同的网络中,则必须确保正确配置了路由器。通常,默认情况下不广播广播。此外,如果您的路由器具有无线接口和有线接口,则如果未启用广播,则这些广播也可能不起作用(默认情况下,可能会有硬件在这两个接口之间转发广播)。



 类似资料:
  • 尽管从 WinPcap 的名字上看,这个库的目标应该是数据捕捉(Packet Capture),然而,它也提供了针对很多其它有用的特性。在其中,我们可以找到一组很完整的用于发送数据包的函数。 请注意:原始的libpcap库是不支持发送数据包的,因此,这里展示的函数都属于是WinPcap的扩展,并且它们不能运行于Unix平台下。 使用 pcap_sendpacket() 发送单个数据包 下面的代码展

  • 问题内容: 我一直在研究一个Java程序,该程序基本上类似于Minechat(基于文本的应用程序,仅用于查看聊天。)我从来没有真正与网络打交道,因此,问题在于弄清楚如何正确发送数据包。我目前处于与服务器创建握手的位置。经过数小时的研究,我提出了以下代码,但始终会遇到“ Failed!(Exception)”消息。对我来说,一切看起来都是正确的,但就我所知,这可能是100%错误的。如果有人可以指出我

  • 问题内容: 我有一个在我和它是一个连接到。当我单击时,我想说“ 单击按钮”。 这可能吗? 我知道两个连接到同一对象的对象可以轻松地相互通信并相互发送数据。但是对象可以将数据发送到对象中吗 编写自己的程序并将其附加到程序上是更好的编程吗?然后,我可以简单地让两个片段相互发送数据。 抱歉,如果这不是StackOverflow的正确类型。我是新手,因此无法在此问题上找到清晰的解释。 提前致谢! 问题答案

  • 我开始构建一些非常简单的应用程序,我想我已经掌握了如何在android Studio中创建基础知识。我一辈子都搞不清楚的是为什么我不能把数据发送到我的firebase实时数据库。 这是一个非常简单的应用程序,我试图让它目前的工作(因为我不能在更丰富的一个)--只需要一个按钮,应该发送“你好,世界!”

  • 问题内容: 我有这个小点击计数器。我想将每次单击都包含在mysql表中。有人可以帮忙吗? 万一有人想看看我做了什么: 这是phpfile.php,出于测试目的,将数据写入txt文件 问题答案: 您的问题中定义的JavaScript不能直接与MySql一起使用。这是因为它不在同一台计算机上运行。 JavaScript在客户端(在浏览器中)运行,并且数据库通常在服务器端存在。您可能需要使用中间服务器端

  • 问题内容: 我的jphp.php文件包含以下内容: 并且我的javascript文件包含以下内容: 我已经用php编码了数据数据..现在我想将这两个数据数组发送到javascript …我不知道要使用的正确命令。我对谷歌搜索感到困惑。 请帮忙 。 问题答案: 使用jQuery的简单特定示例: JavaScript页面: 在您的php中: