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();
}
}
相关文章
- 黑马程序员--Java基础学习之网络编程(TCP、UDP、Socket、模拟发送和接收数据)
- 黑马程序员--Java基础学习之网络编程(TCP、UDP、Socket、模拟发送和接收数据)
- UDP socket_read接收数据导致错误Resource temporarily unavailable
- UDP数据报通信 使用DatagramSocket发送、接收数据(Socket之UDP套接字)
- TCP与UDP的异同(服务端接收数据,客户端发送数据)
- Socket网络通信理论基础搜集(TCP/IP协议栈与数据包封装+TCP与UDP的区别)
- 黑马程序员--Java基础学习之网络编程(TCP、UDP、Socket、模拟发送和接收数据)
- 黑马程序员--Java基础学习之网络编程(TCP、UDP、Socket、模拟发送和接收数据)
- [转]SOCKET通信中TCP、UDP数据包大小的确定
- Socket网络通信理论基础搜集(TCP/IP协议栈与数据包封装+TCP与UDP的区别)