核心原理与环境准备
UDP(用户数据报协议)是一种无连接协议,适用于实时性要求高、允许少量丢包的场景(如设备控制、传感器数据传输),安卓实现需满足:
- 开发环境:Android Studio 2025+,目标API级别≥21(Android 5.0)。
- 网络权限:在
AndroidManifest.xml
中添加:<uses-permission android:name="android.permission.INTERNET" />
- 线程规则:禁止在主线程执行网络操作,否则会触发
NetworkOnMainThreadException
。
Java代码实现步骤(完整示例)
步骤1:创建UDP发送工具类
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UdpSender { public static void sendCommand(String message, String ip, int port) { new Thread(() -> { // 在子线程执行 try { // 创建Socket(不绑定本地端口) DatagramSocket socket = new DatagramSocket(); // 转换消息为字节数据 byte[] buffer = message.getBytes(); // 构建目标地址 InetAddress address = InetAddress.getByName(ip); // 创建数据包 DatagramPacket packet = new DatagramPacket( buffer, buffer.length, address, port ); // 发送数据 socket.send(packet); socket.close(); // 关闭Socket释放资源 } catch (IOException e) { e.printStackTrace(); } }).start(); } }
步骤2:在Activity中调用发送方法
// 示例:发送命令到192.168.1.100的8080端口 UdpSender.sendCommand("LED_ON", "192.168.1.100", 8080);
Kotlin优化版(推荐)
import java.net.DatagramPacket import java.net.DatagramSocket import java.net.InetAddress object UdpUtil { fun sendCommand(message: String, ip: String, port: Int) { Thread { DatagramSocket().use { socket -> // 自动关闭资源 val data = message.toByteArray() val address = InetAddress.getByName(ip) val packet = DatagramPacket(data, data.size, address, port) socket.send(packet) } }.start() } } // 调用示例 UdpUtil.sendCommand("GET_STATUS", "10.0.0.5", 6000)
关键注意事项
-
权限处理:
- 仅
INTERNET
权限不够?若目标设备在局域网,需确保安卓设备与接收端在同一网络。 - Android 9+限制明文流量:若使用HTTP,需在
AndroidManifest.xml
中添加android:usesCleartextTraffic="true"
(不推荐),UDP不受此限制。
- 仅
-
异常处理:
- 捕获
SocketException
(端口占用)、UnknownHostException
(IP错误)。 - 添加超时机制:
socket.setSoTimeout(3000)
(单位:毫秒)。
- 捕获
-
性能优化:
- 复用
DatagramSocket
:频繁发送时避免重复创建。 - 使用线程池管理线程(如
ExecutorService
)。
- 复用
-
安全建议:
- 敏感命令加密:对消息内容使用AES等加密算法。
- 验证目标IP:防止数据发送到恶意地址。
调试技巧
- 使用网络调试工具(如电脑端Wireshark)捕获UDP包验证发送结果。
- 日志输出:在
catch
块中记录错误信息:Log.e("UDP_ERROR", "Send failed: " + e.getMessage());
- 模拟器限制:部分安卓模拟器UDP支持不完善,建议真机测试。
通过DatagramSocket
和DatagramPacket
实现UDP命令发送是安卓开发的基础能力,关键点在于子线程操作、异常处理和资源释放,实际应用中,建议结合具体场景添加数据校验、重发机制等扩展功能,此方案已通过Android 13真机测试,兼容主流设备。
引用说明:本文代码实现参考Android开发者官方文档 – DatagramSocket,权限要求依据Android权限系统指南,安全建议遵循OWASP移动安全标准。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/9369.html