非ブロックUDP I/O vsブロックUDP I/O Java
質問
非ブロッキングTCP/IP SocketChannel
s Selector
にNIOった取扱いを多くのTCP/IP接続を複数のスレッド)。がUDP DatagramChannels
?(I認めなければならないんじUDP.)
UDPの送業務そうにないからブロックの場合においても DatagramChannel
が働いていないブロックモードになります。があった場合 DatagramSocket.send(DatagramPacket)
ブロックによる混雑う?っている場合、その可能性のあるものが存在します。
の場合 DatagramSocket.send(DatagramPacket)
ない実際にブロックやせるわけにはいきません利用で接続 DatagramSocket
と結合する唯一の港であがないを用いた非ブロックモード DatagramChannel
や Selector
?
解決
私のようなJavaのDatagramSockets、チャネルとを使用しましたので、それはしばらくしているが、私はまだあなたにいくつかの助けを与えることができます。
UDPプロトコルはTCPのようなコネクションがする確立されません。むしろ、それだけでデータを送信し、それについて忘れ。それはデータが実際にそこに着くことを確認することが重要であるならば、それはクライアントの責任です。したがって、あなたがブロックモードである場合でも、あなたの送信操作だけであればアウトバッファをフラッシュするのにかかるようのためにブロックします。 UDPは、ネットワークについて何も知らないので、それは、ネットワークの速度をチェックせずにか、それは実際にそれが行くことになっている場所になれば早い機会にそれを書き込みます。このように、あなたに、それはチャネルが実際より送信するため、すぐに準備ができているかのように表示されます。
他のヒント
UDPなブロックでブロックでデータを転送するには、OS) この場合の時点の次のホップ/スイッチの機械できないバッファーのUDPパケットを落とすこともできます。これが望ましい行動です。ですが何かを意識する必要があります。
UDPもを保証するものではありませんへ
- 配信パケットに送信されます。
- なしなくなってしまいます。。
- 前のパケット全体スイッチ。しばしばUDP転送とスイッチがオフになってしまいます。
しかしUDPはマルチキャストで同一のパケットすることができるためります。送り手いただけ、パケットをしています。
るトリッキーなことUDPでの作品の多くが失敗したがひどく時に欠く形で非常に難しいも再現しています。このため、な信頼性もだもので表示されます。
非UDPをブロックし、受信側で主に便利です。 パケットの送信を遅らせることができます(発生する可能性がされていない)他のトラフィックソースの上にゲームトラフィックを優先「のゲーミングネットワークカード」のようなローカルトラフィックシェーピングツール、または過負荷のネットワークカード:送信パケットが唯一の原因地域の実情に遅延させることができます。システムのうち一回。パケットがローカルインターフェイスを出ると、それはもはや、アプリケーションの懸念だ。