1

apache mina 2.0.4 に基づいて tcp サーバーを構築しましたが、クライアントへの書き込みに問題があります。

一度に 1 つのメッセージしか処理できず、バッファ サイズが最大 256 バイトの TCP クライアントがいくつかあります。2 つ以上のメッセージ (< 256 バイト) をクライアントに送信すると、メッセージは 2 つ以上の分離されたメッセージではなく、クライアントが処理できない 1 つまたは 2 つの大きなブロックで到着します。sessionConfig.setTcpNoDelay(true/false);と同様に、成功せずに設定しようとしましたsessionConfig.setSendBufferSize( 256 );

メッセージ応答エンコーダーで、出力をフラッシュしようとしました:

int capacity = 256;
IoBuffer buffer = IoBuffer.allocate(capacity, false);
buffer.setAutoExpand(false);
buffer.setAutoShrink(true);
buffer.putShort(type);
buffer.putShort(length);
buffer.put(gmtpMsg.getMessage().getBytes());
buffer.flip();
out.write(buffer);
out.flush();

そして、メッセージの送信を担当するスレッドで、メッセージが書き込まれるのを待ちました

for (Entry<Long, OutgoingMessage> outgoingMsg : outgoingMsgs.entrySet()) {
      WriteFuture future = session.write(outgoingMsg.getValue());
      future.awaitUninterruptibly();
}

これはすべて惨めに失敗し、機能する唯一の解決策は、セッション書き込み間のばかげた 500 ミリ秒のスリープであり、これはほとんど受け入れられません。私が間違っていることを誰かが見ていますか?

4

1 に答える 1

1

tcpプロトコル、特にhttps://stackoverflow.com/a/6614586/1280034についてもう少し読んだ後、問題がクライアント側にあり、パケットを正しく処理していないことは明らかです。

クライアントを再構築できないため、私の唯一の解決策は、各送信メッセージを約500ミリ秒遅らせることです。そのために、サーバーが通常のジョブを続行できるように、クライアントへの書き込みを担当する追加のキューを作成しました。

于 2012-03-21T05:46:40.350 に答える