【问题标题】:How to broadcast a UDP packet from Android?如何从 Android 广播 UDP 数据包?
【发布时间】:2020-09-23 15:10:44
【问题描述】:

我需要使用 UDP 从我的 Android 应用程序向我的网络(以太网)上的每台设备广播一条消息。 我不知道如何做到这一点,因为似乎没有任何关于如何发送广播消息的文档,只有关于如何使用 IP 地址发送到特定客户端的文档。

谢谢

【问题讨论】:

  • 使用广播IP地址。请记住,广播不会跨路由器,因此您只能在您连接的网络上广播。
  • 只有一个广播地址可以使用:255.255.255.255的有限广播地址。它适用于每个 IPv4 网络,没有真正的理由花费大量周期来计算网络广播地址。当然,广播只适用于 IPv4,因为 IPv6 已经消除了广播,因为它具有侵入性,会中断 LAN 上的每一台主机,这是一个安全问题。现代方法是多播。

标签: java android networking udp


【解决方案1】:

这是一个有用的文档:

google-AdroidUDP

这是一个示例代码:

1- 发件人

 public void sendBroadcast(String messageStr) {
 StrictMode.ThreadPolicy policy = new   StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

try {

  DatagramSocket socket = new DatagramSocket();
  socket.setBroadcast(true);
  byte[] sendData = messageStr.getBytes();
  DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, getBroadcastAddress(), Constants.PORT);
  socket.send(sendPacket);
  System.out.println(getClass().getName() + "Broadcast packet sent to: " + getBroadcastAddress().getHostAddress());
} catch (IOException e) {
  Log.e(TAG, "IOException: " + e.getMessage());
}
}
 InetAddress getBroadcastAddress() throws IOException {
 WifiManager wifi = (WifiManager)    mContext.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) & 0xFF);
return InetAddress.getByAddress(quads);

}

2- 接收者:

      try {
      socket = new DatagramSocket(Constants.PORT, InetAddress.getByName("0.0.0.0"));
 socket.setBroadcast(true);

while (true) {
Log.i(TAG,"Ready to receive broadcast packets!");

byte[] recvBuf = new byte[15000];
DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length);
socket.receive(packet);

Log.i(TAG, "Packet received from: " + packet.getAddress().getHostAddress());
String data = new String(packet.getData()).trim();
Log.i(TAG, "Packet received; data: " + data);

Intent localIntent = new Intent(Constants.BROADCAST_ACTION)
        .putExtra(Constants.EXTENDED_DATA_STATUS, data);
LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent);
    }
    }  catch (IOException ex) {
    Log.i(TAG, "Oops" + ex.getMessage());
    }

【讨论】:

  • 嗯,这包括“wifi 管理器”,这可以通过以太网实现吗?
  • 有一个可以使用的广播地址:255.255.255.255的有限广播地址。它适用于每个 IPv4 网络,没有真正的理由花费大量周期来计算网络广播地址。当然,广播只适用于 IPv4,因为 IPv6 已经消除了广播,因为它具有侵入性,会中断 LAN 上的每一台主机,这是一个安全问题。现代方法是多播。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多