2012-03-20 20 views
1

私はapache mina 2.0.4に基づいてtcpサーバーを構築し、クライアントに書き戻す際にいくつか問題があります。Apache Mina - クライアントへの複数の小さな書き込み

私たちには一度に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(); 
} 
を書き込まれるメッセージを待機してみました

これはすべて悲惨に失敗し、唯一の解決策はセッション書き込みの間にばかげた500msecの睡眠です。これはほとんど受け入れられません。 誰かが私が間違っているのを見ますか?

答えて

1

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

クライアントを再構築できないため、私の唯一の解決策は、各送信メッセージを約500ms遅延させることです。これを行うために、私はクライアントに書込みを担当する余分なキューを作成して、サーバが通常の仕事を続けるようにしました。

関連する問題