首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java DatagramSocket向255.255.255.255发送数据包失败

Java DatagramSocket向255.255.255.255发送数据包失败
EN

Stack Overflow用户
提问于 2011-07-05 15:42:18
回答 4查看 22.9K关注 0票数 15

我正在用java编写一个网络程序,我想发送一些数据包到255.255.255.255,但失败了,即使我把它们发送到192.168.1.255,根据ifconfig命令的输出,192.168.1.255是广播地址。但是,当我将它们发送到我朋友的IP地址时,它工作得很好。

下面是我的程序的代码:

代码语言:javascript
复制
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来做到这一点,下面是我的网络实现:

代码语言:javascript
复制
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());
    }
}

没有抛出异常。

我在一个临时网络中。

我使用的是MacOSX10.6,而我的伙伴使用的是kubuntu 11.04。下面是ifconfig的输出:

代码语言:javascript
复制
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是我用来连接我朋友的设备。

请简单点,我是新手:)

提前谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-07-05 15:50:19

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

代码语言:javascript
复制
socket.setBroadcast(true);

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

票数 11
EN

Stack Overflow用户

发布于 2013-01-11 02:45:30

不需要将您的DatagramSocket连接到广播地址,只需构建指向它的DatagramPacket,即

代码语言:javascript
复制
DatagramPacket dp = new DatagramPacket(byteArray, byteArray.length, InetAddress.getByName("255.255.255.255"), yourPortNumber);

就像魔术一样,你发送了一个广播。然后在另一端捕获它,只需让该端在该端口上侦听:

代码语言:javascript
复制
DatagramSocket dsock = new DatagramSocket(samePortUsedAbove);
DatagramPacket dp = new DatagramPacket(byteArray, byteArray.length);
dsock.receive(dp);
票数 6
EN

Stack Overflow用户

发布于 2011-07-05 18:44:09

代码语言:javascript
复制
192.168.1.255 

  • 请检查网络中的子网掩码。您的发送机和接收机可能不是同一个network.
  • Please的一部分,请检查您的网络中是否存在接收机。
  • 如果你的机器之间有路由器,我认为消息不会被传输。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6579350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档