使用数据报套接字连接发送数据时会触发异常:
目的地地址为空
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异常:
答案 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
中