Java NIO身についてきました。Selector便利です。
Java NIO本を、何度も何度も調べました。この本のホームページも発見。教科書的な書き方で、言葉にキレがないので、ちょっと退屈ですが、ひととおりは書けてます。実際にいろいろやってみると、書かれていないことも多いですが、Webにも特に情報がないので、この本が頼りになります。
さて、今悩んでいるのが、Non-blocking modeのSocketChannel#readで、EOFを検出する方法がないようなんです。SocketChannel#closeすれば、readで-1が返るのでよいのですが、closeしたくないときは方法がありません。転送量が小さいときは一発(数十KB)でreadできるので問題なのですが、転送量が大きいときは、システムレベルで間に合わないので、readで0が返ってくることもあります。これが、終わりなのか転送途中なのか、区別できません。ServerとClientとどちらかでSocket&In/Outstream使えば問題ないのですが、両方NIOだと方法がないようです。うーん。転送サイズをはじめにとりかわすように自分でコーディングするか....、美しくないな。