2

我在编写一个可以与我的服务器通信以发送和接收数据的 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 字符串和编码是否存在可能导致这个问题的东西。起初我认为这可能与字符串的内存分配有关,但我很确定我已经通过设置大小正确处理了这个问题。

4

1 回答 1

0

据我所知,字节数的 UTF-8 编码和字节序看起来是正确的。我认为您唯一缺少的是您需要在 while 循环中进行读取,因为不能保证读取会填充数组。尝试这样的事情。检查 read 的返回值以确定实际读取了多少字节并继续读取,直到您有 'inSize' 字节。

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

int count = 0;
while (count < inSize)
{
   int len = in.read(inData, count, inSize - count);
   count += len;
}
String resp = new String(inData, 0, inSize, "UTF-8");//cast into a String
Log.d("connection", resp);

您需要扩展此代码并处理 len 为 -1 表示流已关闭的情况。

于 2012-11-09T21:56:07.010 回答