You can find great tutorials on using NIO by searching Google. I did one from IBM's DeveloperWorks, and it was pretty complete.
The main concept is that non-blocking sockets don't block when no data is available to read or the buffer is too full to write. That's it in a nut shell.
Normally, if you have a server that handles multiple requests simultaneously, with blocking I/O you're forced to use a separate
thread for each request. If you want to handle 1000 clients at once, you need 1000 threads. Since the majority of time the threads are blocked waiting on I/O operations, this is a huge waste of resources.
With non-blocking I/O, you can have one thread handle all the requests. The thread loops checking a bunch of sockets at once for available data rather than blocking on a single socket.