我已经编写了一个Java应用程序,用于通过UDP与服务器(用C实现)通信。这个应用程序以字符串的形式交换所有数据。
Java代码:
byte[] buff = data.getBytes();
// Parse IP address
InetAddress address = InetAddress.getByName(addr);
// Send data
DatagramPacket pack = new DatagramPacket(buff, buff.length, address, port);
DatagramSocket sock = new DatagramSocket();
sock.send(pack);
// Wait for a response
byte[] recvBuff = new byte[BUFF_SIZE];
DatagramPacket recv = new DatagramPacket(recvBuff, BUFF_SIZE);
sock.receive(recv);
sock.close();
// Pass the data to some down-stream process
handler(new String(recvBuff, "UTF-8");
C代码:
void someFunction(struct sockaddr_in client){
srand(time(0));
int num = rand(); // Generate some garbage data
char* data = malloc(15);
sprintf(data, "%d", num);
send_udp(client, data);
}
/*
* Sends all bytes contained in buf2 over UDP
*/
int send_udp(struct sockaddr_in client, char* buf2){
int len = sizeof(client);
return sendto(sockfd, buf2, strlen(buf2), 0, (struct sockaddr*) &client, len);
}
当我的Java代码从C服务器接收回一个字符串,并将它接收到的字节解析为一个字符串时,该字符串看起来是“不完整的”,在调试器或堆栈跟踪中查看时没有右引号。这些字符串还会导致几个内置方法抛出异常。例如,将这样一个包含其他有效整数的字符串传递给Integer.parse()将导致引发数字格式异常。
Exception in thread "Thread-0" java.lang.NumberFormatException: For input string: "26310
我已经确认我正在使用UTF-8解码原始的UDP字节。
我的C代码运行在64位的Ubuntu 16.04安装上。我的Java代码通过EclipseNeon.3 (4.6.3)在OpenJDK 1.8.0_151上运行。
有没有人知道为什么会发生这种情况,以及如何解决?
发布于 2018-02-26 18:46:35
如果Java代码没有接收到字符串的一部分,那么C代码就不会发送它。UDP数据报被完整地接收,或者根本不被接收。或者您的接收缓冲区太短。
接收到的字符串不可能有null终止符。
我看不到任何证据或原因,发送的字符串甚至应该有一个前导引号,更不用说尾随引号了。我认为您误解了错误消息。我认为真正的问题是:
new String(recvBuff, "UTF-8");
这应该是
new String(recv.getData(), 0, recv.getLength(), "UTF-8");
https://stackoverflow.com/questions/48994949
复制相似问题