Non Blocking I/O

シングルスレッドで複数のクライアントからのリクエストをサーバで処理するとき、ノンブロッキングI/Oを使った方法がとられます。一般的なHTTPサーバーなどはスレッドごとに受信処理を割り当てますが、小規模でデータサイズが小さい処理など場合は多数のリクエストに対して高いパフォーマンスを発揮します。
UDPは、もともとステートレスなのでこのようなしくみを使う必要はないのでは、という疑問もありますが、サーバーサイドプログラミングというのは、いろんなケースを想定する必要があるため、セレクタによる監視機能を使った方が安定するという気がしています。
最近使うことがあったので、今後の参考としてTCP、UDPの両方を置いておきたいと思います。

これまではC言語で実装することが多かったので、Javaでは初めてでした。(仕事ではよく使うものの、このブログもJava関係はめずらしい)

クライアントには、ncコマンド を使用。

nc localhost 9999
nc localhost 9999 -u

ソケットレベルのサーバプログラム自作して長く安定して動かすには、クライアントアプリよりも10倍以上難しいと思っています。(それゆえ実用サーバでは枯れた技術を組みあわせて使われる)
最近はプラットホームがすでに出来上がっていたりするため、なかなかこのレベルから作ることは少ないですが、私は相変わらず面白い分野だと思っています。