But in the interests of fairness, NIO is superior in all regards.
There are good reasons for using old IO (e.g. "I already know it very well", "I have libraries that use it exclusively whihc I have to re-use", and "I'm only allowing a maximum of 4 clients to my server - it's a 4-player game - so I don't care that my IO is slow and hard to code against"), but if you've got no legacy code, NIO is generally always a better choice.
In the interest of fairness, I have to admit that it is exactly my case. (I already know it well / I have legacy libraries / it is fully sufficient for my purposes).
It may be a little bit off topic, but I also have certain small prejudice against middleware software. But I'm not expert in this area, you sure can correct me:
The question is, what level of flexibility can middleware provide you, regarding low-level format of tcp messages being sent?
For example I like to have total control, I don't need no redundant headers, I like to have every single byte in the message for my purpose (and not for purpose of middleware).
For example I saw few middlewares, which tried to FORCE me to communicate in xml format! I definitely don't want this.
How is it done in other middlewares? How is it done in grexengine? Can I have my messages in entirely custom format, without any middleware headers? If no, then how big these headers are?