java - 如何从 Android 广播 UDP 数据包?
问题描述
我需要使用 UDP 从我的 Android 应用程序向我的网络(以太网)上的每个设备广播一条消息。我不知道如何做到这一点,因为似乎没有任何关于如何发送广播消息的文档,只有关于如何使用 IP 地址发送到特定客户端的文档。
谢谢
解决方案
这是一个有用的文档:
这是一个示例代码:
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());
}
推荐阅读
- python - Python脚本保存/复制到特定目录
- chocolatey - 如何告诉巧克力垫片使用安装文件所在的原始网络位置的路径
- sql-server - 如何在级联删除中访问已删除的父数据?
- c++ - 符号“矢量”无法解析
- php - Laravel 6.x - 无法在公用文件夹上使用 session() 全局帮助程序
- java - 如果 Kubernetes 上存在多个 pod,则在 Spring 中从单个 pod 运行 Scheduled Cron 方法
- spring - 使用 Spring Boot 将 SOAP Header 与主体一起发送到 SOAP 服务器
- java - tomcat上的多个spring boot web应用程序不起作用
- netsuite - Suitescript 2.0 在带有子列表的数组中显示数组
- java - 通过java编码更新/替换google bigquery中的tabledata