1

C++ クライアント アプリケーションと Java サーバーがあります。クライアント アプリはサーバーに接続し、データを送信します。

たとえば、整数値を送信します。

boost::shared_ptr<TSocket> socket(new TSocket(hostMS, portMS));
    boost::shared_ptr<TFramedTransport> transport(new TFramedTransport(socket));
    boost::shared_ptr<TBinaryProtocol> protocol(new TBinaryProtocol(transport));

transport->open();
protocol->writeI32(0xCA12EEAA);
transport->writeEnd();
transport->flush();

サーバー側のコードは次のとおりです。

int nMagic =0;
// int nLen = in.readInt(); <------------here is I read the length
int ch1 = in.read();
                int ch2 = in.read();
                int ch3 = in.read();
                int ch4 = in.read();
                if ((ch1 | ch2 | ch3 | ch4) < 0)
                    throw new EOFException();
             nMagic = ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));

問題は、読み取り整数をもう 1 つ追加すると (コメントを参照)、問題なく動作することです。まず、長さ (4 バイト) を読み取り、次にデータ - 整数を読み取ります。

クライアントが長さ (int) データ (int) を送信することを意味します。

ただし、サーバーはデータのみを読み取ります。

どうすればデータのみを送信できますか? 別のthriftトランスポートまたはプロトコルを使用するか、非thriftライブラリを使用できます...

4

3 に答える 3

3

より一般的なステートメントは、クライアント側の Thrift プロトコル/トランスポート スタックがサーバー側と一致する必要があるということです。そうしないと、問題が発生する可能性が非常に高くなります。

たとえば、サーバーがバイナリ プロトコル、フレーム化および多重化トランスポートを使用する場合、クライアントはまったく同じことを行う必要があります。

于 2013-08-29T20:33:48.907 に答える
1

ただし、ノンブロッキング サーバーを使用する場合は、TFramededTransport を使用する必要があります。

于 2014-11-16T15:00:59.403 に答える
0

TFramedTransport はバッファーの前に (!) 長さを追加するため、TFramededTransport の代わりに TBufferedTransport を使用するには。

于 2013-08-29T18:39:50.037 に答える