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 ミリ秒のスリープであり、これはほとんど受け入れられません。私が間違っていることを誰かが見ていますか?