В настоящее время я работаю над соединением клиент-сервер.
Клиент написан на Джава не используя QT на телефоне Android, сервер написан на C ++ с использованием Qt framework.
клиент получает QByteArrays , QStrings а также QLists, но я понятия не имею, как десериализовать и интерпретировать поступающие данные.
Исходный код C ++, который создает пакет, который я должен прочитать на стороне клиента Java, выглядит следующим образом:
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;
Связь между клиентом и сервером установлена и работает нормально. Я понимаю, как читать целые числа, которые сервер отправляет мне, например. Я также знаю, как читать байты, но что мне делать с этими байтами? Как я могу отформатировать их, например, в строку?
Может кто-нибудь мне помочь?
Я действительно ценю любую помощь!
Вы можете конвертировать Qt Strings в 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 используется повторно, что является хорошим увеличением производительности, если вы часто читаете данные, но это, конечно, не является поточно-ориентированным без дополнительного кода.
Формат QDataStream
зарегистрировано, например, в http://qt-project.org/doc/qt-4.8/datastreamformat.html. Это должно сказать вам, что вам нужно знать, чтобы десериализовать его для типов Java.
На вашем сервере вы должны знать, что клиент «спрашивает» и правильно отвечает.
На стороне клиента то же самое, вы должны понимать, что сервер «отвечает».
Таким образом, вы должны создать свой собственный «протокол» связи между вашим сервером и клиентом.
То, что обменивается через провод, это только последовательность байтов, а не QByteArray ни QList.
API QTcpSocket дает вам все, что вам нужно знать о подключенном клиенте (если предполагается, что приложение поддерживает более одного клиента, это ваше дело, и как записывать данные в сокет).
На стороне клиента будет почти то же самое, но я никогда не разрабатывал в Android, поэтому не могу ничего предложить.
Это мой ответ очень кратко объясняет, как собрать клиент-сервер приложения в Qt. Может быть, может быть полезным.
В случае, если кто-нибудь сталкивается с этой темой:
Я рекомендую использовать Буферы протокола вместо передачи данных по проводам.