SocketChannel.write() を介して大量のデータを送信しているときに、基礎となる TCP バッファーがいっぱいになることがあります。データがすべて送信されるまで、write() を継続的に再試行する必要があります。
だから、私はこのようなものを持っているかもしれません:
public void send(ByteBuffer bb, SocketChannel sc){
sc.write(bb);
while (bb.remaining()>0){
Thread.sleep(10);
sc.write(bb);
}
}
問題は、大規模な ByteBuffer と基礎となる TCP バッファのオーバーフローが時折発生する問題であり、send() へのこの呼び出しが予期しない時間にわたってブロックされることを意味します。私のプロジェクトでは、何百ものクライアントが同時に接続されており、1 つのソケット接続によって引き起こされる 1 つの遅延により、1 つの SocketChannel によるこの 1 つの遅延が解決されるまで、システム全体がクロール状態になる可能性があります。遅延が発生すると、プロジェクトの他の領域で速度が低下するという連鎖反応が発生する可能性があり、遅延が少ないことが重要です。
この TCP バッファ オーバーフローの問題を透過的に処理し、SocketChannel.write() への複数の呼び出しが必要な場合にすべてをブロックすることのないソリューションが必要です。send() を Thread を拡張する別のクラスに配置して、独自のスレッドとして実行し、呼び出し元のコードをブロックしないようにすることを検討しました。ただし、維持している各ソケット接続のスレッドを作成する際に必要なオーバーヘッドが心配です。特に、99% の確率で SocketChannel.write() が最初の試行で成功する場合、スレッドが存在する必要がないことを意味します。 . (つまり、send() を別のスレッドに配置する必要があるのは、while() ループが使用されている場合のみです。バッファの問題が発生した場合のみ、おそらく 1% の時間です) バッファの問題がある場合1%の確率で、私はそうしません
それが理にかなっていることを願っています...いくつかの提案を実際に使用できます。ありがとう!