主要用到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();
}
}