【发布时间】:2012-02-20 16:41:01
【问题描述】:
我正在编写一个客户端/服务器应用程序,其中客户端是用 C++ 编写的,而服务器是 Java。它们之间的通信是通过UDP协议进行的。 他们需要通过网络交换字符串消息。 现在,通信工作很多,客户端发送消息,服务器接收它,但我注意到接收到的字符串,在 Java 端,就像中继一样。我的意思是,如果我尝试将其显示到控制台上,使用以下功能:
System.out.println("This is the message received "
+ message + " by the client just now");
我得到的结果是:
This is the message received *message*
将字符串“by the client just now”中继出来。
我认为这是由于Java和C++之间的一些不兼容,但我找不到解决方案。
编辑: 这是接收器的代码:
byte[] bytes = _packet.getData(); // Datagram Packet
hostName = getStringFromBytes(bytes, 0, 15);
(...)
private String getStringFromBytes (byte[] bytes, int lowerBound, int length)
{
byte[] bufferBytes = new byte[length];
System.arraycopy(bytes, lowerBound, bufferBytes, 0, length);
return new String(bufferBytes).trim();
}
和发件人:
if(sendto(_socket, buffer, BUFFER_LEN, 0, (struct sockaddr*) &_serverAddress, addressLenght) == -1)
cout << "Trasmission failed!\n" << endl;
其中 buffer 是一个字符数组。
【问题讨论】:
-
消息可能是0-终止的?
-
一旦遇到问题,它就不是 java vs C++ 的事情了。基于@BoBTFish,您应该尝试使用 message.trim() 删除空格和 ascii 控制字符。
-
我已经更新了帖子,插入了代码。 trim() 已经完成了,但我还是不知道。
-
我的猜测是您正在从 c++ 发送一个以 null 结尾的 char[] 并且您的 JAVA 代码没有正确处理它。
-
String.trim 删除 ASCII 中小于或等于空格的前导和尾随字符。因此,如果缓冲区中的结束字节为 32(int)或更少,它就可以工作。如果不是,则结束字节可能表示修剪无法捕获的某些控制字符。
标签: java c++ string network-programming udp