核心原理与环境准备
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