收到的UDP消息长度不正确

时间:2016-04-10 17:52:59

标签: java sockets udp

我正在收到来自DatagramSocket的UDP消息,并试图解析这样的消息:

this.broadSock.receive(recvPacket);

// Decode response
byte[] response = recvPacket.getData();
String strResp = new String(response);
String[] splitResp = strResp.split("\\s+");
log.debug("The String: " + strResp + " has the length " + strResp.length());

InetAddress lobbyAdress = InetAddress.getByName(splitResp[0].substring(1));
String portStr = splitResp[1];
int lobbyPort = Integer.parseInt(portStr);

我收到以下例外:

java.lang.NumberFormatException: For input string: "8080"

因为调试输出给了我:

,收到的字符串有问题
The String: /192.168.0.11 8080 has the length 256

有人知道为什么会这样吗?

2 个答案:

答案 0 :(得分:1)

提供长度,您忽略它。它应该是:

String strResp = new String(packet.getData(), packet.getOffset(), packet.getLength());
String[] splitResp = strResp.split("\\s+");
log.debug("The response: " + strResp + " has the length " + packet.length());

答案 1 :(得分:0)

strResp.length为256的事实是代码中的错误的症状。它应该是18而不是。

您正在使用strResp缓冲区的整个长度构建DatagramPacket,而不考虑该缓冲区中实际有多少字节。 DatagramPacket.getData()仅为收到的字节返回新的byte[]。它返回整个缓冲区。

这意味着strResp在端口号后面会有238个额外字符,而且它们不是split("\\s+")所剥离的空白字符,因此splitResp[1],因此{{ 1}},最终不仅包含数字字符,因此违反了strPort的要求。

构建Integer.parseInt()时需要考虑DatagramPacket长度:

strResp