数据报套接字请求目标地址

时间:2017-08-03 08:01:01

标签: android sockets

使用数据报套接字连接发送数据时会触发异常:

  

目的地地址为空

DatagramSocket ds = new DatagramSocket(1050);
                ds.setBroadcast(true);
                InetAddress broadcastAdress = getBroadcastAdd();
                DatagramPacket pack = new DatagramPacket(data, data.length, broadcastAdress, 1050);
                ds.send(pack);
                ds.close();

为什么说如果UDP意味着广播,那么接收者是每个人,没有特定的地址?

必须使用哪个地址以及应该放在哪里?

我正在使用该代码获取该地址:

private InetAddress getBroadcastAdd() throws UnknownHostException {
    WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    DhcpInfo dhcp = wifi.getDhcpInfo();
    int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask;
    byte[] quads = new byte[4];
    for (int k = 0; k < 4; k++)
        quads[k] = (byte) (broadcast >> (k * 8));
    return InetAddress.getByAddress(quads);
}

但我仍然有null异常:

image

1 个答案:

答案 0 :(得分:2)

如果要使用UDP广播消息,则应使用套接字上的setBroadcast,并使用广播地址(即使在广播的情况下也始终需要地址)。

DatagramSocket udpSocket = new DatagramSocket(1050);
udpSocket.setBroadcast(true);
InetAddress broadcastAdress = getAdressBroadcast();
DatagramPacket pack = new DatagramPacket(data, data.length, broadcastAdress, 1050);
udpSocket.send(pack);

使用这样的getAddressBroadcast:

public static String getAdressBroadcast() throws SocketException {
    System.setProperty("java.net.preferIPv4Stack", "true");
    for (Enumeration<NetworkInterface> networkInterfaceEnum = NetworkInterface.getNetworkInterfaces(); networkInterfaceEnum.hasMoreElements();) {
        NetworkInterface networkInterface = networkInterfaceEnum.nextElement();
        if (!networkInterface.isLoopback()) {
            for (InterfaceAddress interfaceAddress : networkInterface.getInterfaceAddresses()) {
                return interfaceAddress.getBroadcast().toString().substring(1);
            }
        }
    }
    return null;
}

作为旁注,不要忘记这些操作(网络操作)不应该在主活动线程中完成,而应该在Async task