Android 使用UDP进行通讯(发送数据和接收数据)
主要用到DatagramSocket和DatagramPacket 类;DatagramSocket使用的UDP连接,客户端不需要先连接数据,可以直接发送给指定服务端。;DatagramPacket 用来发送和接收数据;
/** * * */ public class Client2 { private static DatagramSocket client; /** * 连接的方法 * * @param head 发送指令 * @param iCallUdp 返回的接口数据 */ public static void main(String head, ICallUdp iCallUdp) { if (TextUtils.isEmpty(head)) { head = "$M"; } iCallUdp.start(); try { // 1,创建服务端+端口 if (client != null) { client.close(); client = null; } client = new DatagramSocket(null); client.setReuseAddress(true); //myPort 设置自己的端口号 用于相互通信 client.bind(new InetSocketAddress(myPort)); // 2,准备数据 byte[] data = head.getBytes(); // 3,打包(发送的地点及端口) //IP 连接的目标IP地址 //port 连接目标的 端口号 DatagramPacket packet = new DatagramPacket(data, data.length, new InetSocketAddress(IP, port)); // 4,发送资源 client.send(packet); //发送成功 // iCallUdp.confirm(); // 准备接收容器 byte[] container = new byte[19]; // 封装成包 DatagramPacket packet2 = new DatagramPacket(container, container.length); // 接收数据,使用 DatagramSocket的实例的 receive( DatagramPacket ) 方法进行接收 client.receive(packet2); // 分析数据、打印数据 byte[] data2 = packet2.getData(); System.out.println("-----------" + bytesToHex(data2)); //回调传接收的数据 iCallUdp.success(bytesToHex(data2)); // 5,关闭资源 client.close(); } catch (Exception e) { System.out.println(e.getMessage() + "==" + e.toString()); iCallUdp.failure(e.getMessage()); } } /** * 将接收到byte数组转成String字符串 * * @param bytes 接收的byte数组 * @return string字符串 */ private static String bytesToHex(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (byte aByte : bytes) { String hex = Integer.toHexString(aByte & 0xFF); if (hex.length() < 2) { sb.append(0); } sb.append(hex); } return sb.toString(); } }