# DeviceUDPManager 使用说明 ## 概述 `DeviceUDPManager` 是基于 KryoNet 库实现的 UDP 通信管理器,支持客户端和服务端两种模式,提供了完整的 UDP 数据收发功能。 ## 特性 - ✅ 支持客户端和服务端模式 - ✅ 自动重连机制 - ✅ 线程安全的数据收发 - ✅ 支持多种数据类型(String、Integer、byte[]等) - ✅ 完整的事件回调机制 - ✅ 单例模式,全局统一管理 ## 快速开始 ### 1. 依赖已添加 在 `app/build.gradle` 中已添加必要依赖: ```gradle // KryoNet UDP通信库 implementation 'com.esotericsoftware:kryonet:2.22.0-RC1' implementation 'com.esotericsoftware:kryo:2.24.0' ``` ### 2. 权限配置 在 `AndroidManifest.xml` 中已包含必要权限: ```xml ``` ### 3. 基本使用 #### 客户端模式 ```java // 获取管理器实例 DeviceUDPManager udpManager = DeviceUDPManager.getInstance(); // 设置监听器 udpManager.setMessageListener(new DeviceUDPManager.UDPMessageListener() { @Override public void onMessageReceived(Object message, Connection connection) { Log.i("UDP", "收到消息: " + message); } @Override public void onMessageSent(Object message) { Log.i("UDP", "发送成功: " + message); } @Override public void onMessageSendFailed(Object message, String error) { Log.e("UDP", "发送失败: " + error); } }); udpManager.setConnectionStateListener(new DeviceUDPManager.ConnectionStateListener() { @Override public void onConnected() { Log.i("UDP", "连接成功"); // 可以开始发送消息 udpManager.sendUDPMessage("Hello Server!"); } @Override public void onDisconnected() { Log.i("UDP", "连接断开"); } @Override public void onConnectionFailed(String error) { Log.e("UDP", "连接失败: " + error); } @Override public void onReconnecting(int attempt) { Log.i("UDP", "重连中,第 " + attempt + " 次"); } }); // 初始化为客户端 udpManager.initializeAsClient(context, "192.168.1.100", 54555, 54777); ``` #### 服务端模式 ```java // 获取管理器实例 DeviceUDPManager udpManager = DeviceUDPManager.getInstance(); // 设置监听器(同客户端) // ... // 初始化为服务端 udpManager.initializeAsServer(context, 54555, 54777); ``` ### 4. 发送消息 ```java // 发送字符串消息 udpManager.sendUDPMessage("Hello UDP!"); // 发送数字消息 udpManager.sendUDPMessage(12345); // 发送JSON格式消息 String jsonMsg = "{\"type\":\"status\",\"value\":\"online\"}"; udpManager.sendUDPMessage(jsonMsg); // 服务端模式:发送消息给特定客户端 udpManager.sendUDPMessageToConnection(connection, "Hello Client!"); ``` ## API 参考 ### 主要方法 #### 初始化方法 - `initializeAsClient(Context, String, int, int)` - 初始化为客户端 - `initializeAsServer(Context, int, int)` - 初始化为服务端 #### 消息发送 - `sendUDPMessage(Object)` - 发送UDP消息 - `sendUDPMessageToConnection(Connection, Object)` - 发送消息给特定连接(服务端模式) #### 状态管理 - `isConnected()` - 获取连接状态 - `isInitialized()` - 获取初始化状态 - `isClientMode()` - 获取当前模式 - `reconnect()` - 手动重连(客户端模式) - `stop()` - 停止UDP管理器 - `release()` - 释放所有资源 #### 配置方法 - `setMessageListener(UDPMessageListener)` - 设置消息监听器 - `setConnectionStateListener(ConnectionStateListener)` - 设置连接状态监听器 - `setAutoReconnect(boolean)` - 设置自动重连 ### 回调接口 #### UDPMessageListener - `onMessageReceived(Object, Connection)` - 接收到消息 - `onMessageSent(Object)` - 消息发送成功 - `onMessageSendFailed(Object, String)` - 消息发送失败 #### ConnectionStateListener - `onConnected()` - 连接成功 - `onDisconnected()` - 连接断开 - `onConnectionFailed(String)` - 连接失败 - `onReconnecting(int)` - 重连中 ## 使用场景 ### 1. 设备间通信 ```java // 设备A作为服务端 udpManager.initializeAsServer(context, 54555, 54777); // 设备B作为客户端 udpManager.initializeAsClient(context, "设备A的IP", 54555, 54777); ``` ### 2. 命令控制 ```java // 发送控制命令 udpManager.sendUDPMessage("command:restart"); udpManager.sendUDPMessage("command:get_status"); // 接收端处理 @Override public void onMessageReceived(Object message, Connection connection) { if (message.toString().startsWith("command:")) { String command = message.toString().substring(8); handleCommand(command, connection); } } ``` ### 3. 状态同步 ```java // 定期发送状态信息 String status = "{\"device_id\":\"" + Build.MODEL + "\",\"status\":\"online\"," + "\"timestamp\":" + System.currentTimeMillis() + "}"; udpManager.sendUDPMessage(status); ``` ## 注意事项 1. **线程安全**: 所有方法都是线程安全的,可以在任意线程调用 2. **网络权限**: 确保应用具有网络访问权限 3. **端口占用**: 避免端口冲突,确保指定端口未被其他应用使用 4. **数据类型**: 发送的对象需要是Kryo支持的类型或已注册的自定义类型 5. **资源释放**: 在不需要时调用 `stop()` 或 `release()` 释放资源 6. **异常处理**: 网络操作可能失败,注意处理回调中的错误信息 ## 测试 可以使用提供的 `UDPTestActivity` 进行功能测试: 1. 在 `AndroidManifest.xml` 中注册Activity 2. 启动Activity进行测试 3. 可以在同一设备上启动服务端和客户端进行本地测试 ## 扩展 ### 自定义数据类型 ```java // 注册自定义类型 public class CustomMessage { public String type; public String content; public long timestamp; } // 在初始化时注册 udpManager.getKryo().register(CustomMessage.class); ``` ### 加密通信 可以在发送前加密消息,接收后解密: ```java // 发送加密消息 String encrypted = encrypt(originalMessage); udpManager.sendUDPMessage(encrypted); // 接收解密消息 String decrypted = decrypt(encryptedMessage); ```