Java-从UDP事务接收格式错误/不完整的字符串

Java-从UDP事务接收格式错误/不完整的字符串,java,c,udp,Java,C,Udp,我编写了一个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);

我编写了一个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)在OpenJDK1.8.0_151上运行


有人知道为什么会发生这种情况以及如何解决吗?

如果Java代码没有收到字符串的一部分,C代码就不会发送它。UDP数据报被完整接收或根本不接收。或者您的接收缓冲区太短

收到的字符串不可能有空终止符

我看不到任何证据表明,或者为什么,发送的字符串甚至应该有一个前导引号,更不用说尾随引号了。我认为你误解了错误信息。我认为真正的问题在于:

new String(recvBuff, "UTF-8"); 
应该是哪一个

new String(recv.getData(), 0, recv.getLength(), "UTF-8");

旁白:在C代码
srand中(时间(0))
应该在
main
中调用一次,而不是在调用
rand()
的函数中调用一次。如果您想使用垃圾值进行测试,根本不要调用
srand()
,那么序列将是可重复的。您可能希望使用本地字符串,而不是动态内存,因为存在内存泄漏,但这仅在
send_udp
是同步的情况下才有效。“我已验证字符串是否有空终止符”“奇怪,因为sending strlen(buf2)”不包括NUL。发送了多少字节?收到了多少字节?哦,你从来没有检查过
recv.getLength()
。为什么呢?您不认为这是重要的信息吗,即
recvBuff
中实际存储了多少字节?在收到的字节之后的缓冲区中的任何字节都是0,因为这是创建缓冲区时的值。@MartinJames,你是对的。“空终止符”来自接收缓冲区中的多余空间。编辑问题以反映这一点。谢谢,这解决了问题。我将接收缓冲区中多余的空间解释为“空终止符”,并错误地认为初始化字符串时需要存在空终止符。