1

我目前正在处理客户端-服务器连接。

客户端是用Java编写的,不使用在 Android 手机上运行的 QT,服务器是使用Qt 框架用 C++ 编写的。

客户端收到 QByteArraysQStringsQLists,但我不知道如何反序列化和解释传入的数据。

创建我必须在 java 客户端读取的数据包的 C++ 源代码如下所示:

QByteArray body;
QString string1, string2, string3;
QList<float> list;
qint8 recognitionCount;

QDataStream bodyStream(&body, QIODevice::WriteOnly);

bodyStream << recognitionCount;

bodyStream << string1.toUtf8()
<< string2.toUtf8()
<< string3.toUtf8()
<< list;

客户端和服务器之间的连接已启动并运行良好。例如,我了解如何读取服务器发送给我的整数。我也知道如何读取字节,但我应该如何处理这些字节?例如,如何将它们格式化为字符串?

谁能帮我吗?

我真的很感激任何帮助!

4

4 回答 4

2

您可以像这样从 Qt 字符串转换为 Java(根据此定义):

final static int MAX_STRING_LENGTH = 10240; // arbitrary number
private final static ByteBuffer stringBytes = ByteBuffer.allocate(MAX_STRING_LENGTH);

static String readStringFromQTStream(final ObjectInputStream in) throws IOException {
  if (in.available() < (Integer.SIZE / 8)) { // check that there are at least 4 bytes for the length
    throw new IOException("Illegal data received: expected integer but only got " + in.available() + " bytes");
  }
  final int stringLength = in.readInt();
  if (stringLength == 0xFFFFFFFF) { // Qt for null string
    return null;
  }
  if ((stringLength < 0) || (stringLength > stringBytes.capacity())) { // check for malformed data
    throw new IOException("Illegal data received: string with supposed length of " + stringLength + " bytes");
  }

  stringBytes.clear(); // global var, not thread-safe!
  in.readFully(stringBytes.array(), 0, stringLength);
  stringBytes.flip();
  return StandardCharsets.UTF_8.decode(stringBytes).toString();
}

请注意,ByteBuffer 被重用,如果您经常读取数据,这是一个很好的性能提升,但是如果没有进一步的代码,这当然不是线程安全的。

于 2013-11-23T13:35:38.080 回答
1

的格式QDataStream记录在例如http://qt-project.org/doc/qt-4.8/datastreamformat.html。这应该告诉您将其反序列化为 Java 类型需要了解的内容。

于 2013-11-19T11:08:08.037 回答
0

在您的服务器上,您必须知道客户“问”什么并正确回答。同样在客户端,您必须了解服务器的“答案”。因此,您必须在服务器和客户端之间创建自己的通信“协议”。

通过线路交换的只是一个字节序列,而不是QByteArrayQList

QTcpSocket的 API为您提供了所有您需要了解的客户端连接(如果应用程序应该支持多个客户端是您的业务,以使其成为可能)以及如何写入套接字的一切。

在客户端几乎是一样的,但我从来没有在 Android 上开发过,所以不能提出任何建议。

这个我的回答非常简要地解释了如何在 Qt 中构建应用程序客户端服务器。也许会有用。

于 2013-11-14T01:15:48.673 回答
0

如果有人遇到这个线程:

我建议改为使用协议缓冲区进行在线数据传输。

于 2015-08-15T21:40:41.363 回答