我在编写一个可以与我的服务器通信以发送和接收数据的 android 应用程序时遇到了一些麻烦。所以它的要点是我的服务器是用 Qt C++ 编写的,当然,我的应用程序是用 java 为 android 编写的。让套接字数据采用适当的格式以供双方充分理解,这引起了很多复杂性。
那么我遇到的问题是我的客户端(java android)可以连接到服务器,发送少量数据,并从服务器接收响应。服务器发送一个相当大的数据消息,转换为 UTF-8 字节。
QByteArray sendblock;
QDataStream out(&sendblock, QIODevice::WriteOnly);
out << (quint16)0;
char * data = msg.toUtf8().data();
out.writeRawData(data, msg.toUtf8().length());
out.device()->seek(0);
out << (quint16)(sendblock.size() - sizeof(quint16));
socket.write(sendblock);
socket.waitForBytesWritten();
msg 是传递给函数的 QString。
在客户端,收到消息后,我有:
Log.d("connection", "Waiting for response");
short inSize;
inSize = in.readShort();
Log.d("connection", Integer.toString(inSize)); // the first 2 bytes are the size of the message
byte[] inData = new byte[inSize];//allocate space for the entire message
in.read(inData, 0, inSize); //read the entire message
String resp = new String(inData, 0, inSize, "UTF-8");//cast into a String
Log.d("connection", resp);
所以问题是在我的程序的不同实例上,转换为 String 的字节的结果不同。
Log.d 打印响应的结果大约是正确格式化为字符串的字符串的 1445 个字母(2890 字节),然后字符串的其余部分以“??”结尾 人物。
我很少按预期收到完整的消息,没有“?” 人物。有时我会得到更长的消息正确地转换为字符串。大多数情况下,我只得到正确投射的 1445 个字母,其余的都是“??” 人物。
我有另一个 Windows 计算机客户端(也是用 Qt C++ 编写的),它总是让消息完整并且没有这个问题,所以我很好奇 android 字符串和编码是否存在可能导致这个问题的东西。起初我认为这可能与字符串的内存分配有关,但我很确定我已经通过设置大小正确处理了这个问题。