首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java -从UDP事务接收格式错误/不完整的字符串

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

Stack Overflow用户
提问于 2018-02-27 02:37:17
回答 1查看 208关注 0票数 1

我已经编写了一个Java应用程序,用于通过UDP与服务器(用C实现)通信。这个应用程序以字符串的形式交换所有数据。

Java代码:

代码语言:javascript
运行
复制
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代码:

代码语言:javascript
运行
复制
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()将导致引发数字格式异常。

代码语言:javascript
运行
复制
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上运行。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-27 02:46:35

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

接收到的字符串不可能有null终止符。

我看不到任何证据或原因,发送的字符串甚至应该有一个前导引号,更不用说尾随引号了。我认为您误解了错误消息。我认为真正的问题是:

代码语言:javascript
运行
复制
new String(recvBuff, "UTF-8"); 

这应该是

代码语言:javascript
运行
复制
new String(recv.getData(), 0, recv.getLength(), "UTF-8");
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48994949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档