TCP/UDP socket UDP接收数据——已测试通过

时间:2021-05-28 20:43:28
public class UDPClient {

/**接收UDP十六进制数据
* @throws IOException
*/
public  void Recv() throws IOException {
System.out.println("接受数据开始......");
DatagramSocket ds = null;
try {
ds = new DatagramSocket(2000);// UDP通信类 2000为端口号


} catch (SocketException e1) {
// prompt("本地接收端口已被使用");
System.out.println("本地接收端口已被使用");
System.exit(0);
}
while (true) {
byte[] buf = new byte[1024];


DatagramPacket dp = new DatagramPacket(buf, buf.length); // 接收数据
ds.receive(dp);// 从绑定接收数据
// System.out.println(ds);
String ip = dp.getAddress().getHostAddress();// ip地址
int port = dp.getPort();// 返回接收或发送该数据报文的远程主机端口号。
String text = bytesToHex(dp.getData(),0,dp.getLength());
//String text = new String(dp.getData(), 0, dp.getLength());// 获取的串口数据
if (text.equals("exit")) {
System.out.println(ip + "退出会话......");
break;
}
System.out.println(ip + ":" + port + "===>me " + text);

}


ds.close();
}


/**
* 将 byte 数组转化为十六进制字符串
*
* @param bytes
*            byte[] 数组
* @param begin
*            起始位置
* @param end
*            结束位置
* @return byte 数组的十六进制字符串表示
*/
private  String bytesToHex(byte[] bytes, int begin, int end) {
StringBuilder hexBuilder = new StringBuilder(2 * (end - begin));
for (int i = begin; i < end; i++) {
hexBuilder.append(Character.forDigit((bytes[i] & 0xF0) >> 4, 16)); // 转化高四位
hexBuilder.append(Character.forDigit((bytes[i] & 0x0F), 16)); // 转化低四位
//hexBuilder.append(' '); // 加一个空格将每个字节分隔开
}
return hexBuilder.toString().toUpperCase();
}



}