1

現在、クライアントサーバー接続に取り組んでいます。

クライアントは、Android フォンで実行される QT を使用せずにJavaで記述されています。サーバーは、 Qt フレームワークを使用して C++ で記述されています。

クライアントはQByteArraysQStrings、およびQListsを受け取りますが、受信データを逆シリアル化して解釈する方法がわかりません。

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 に答える
0

サーバーでは、クライアントが何を「尋ね」、正しく答えるかを知る必要があります。クライアント側でも同じように、サーバーが「応答」するものを理解する必要があります。したがって、サーバーとクライアント間の通信の独自の「プロトコル」を作成する必要があります。

ワイヤを介して交換されるのはバイトのシーケンスのみであり、QByteArrayQListではありません。

QTcpSocketの API は、接続されたクライアント (アプリケーションが複数のクライアントをサポートすることになっている場合) を知るために必要なすべてと、ソケットへの書き込み方法を提供します。

クライアント側もほぼ同じですが、私は Android で開発したことがないので、何も提案できません。

This my answerは、Qt でアプリケーション クライアント サーバーを構築する方法を非常に簡単に説明しています。多分役に立つかもしれません。

于 2013-11-14T01:15:48.673 に答える