The idea with non-blocking I/O is to be able to handle multiple sockets without resorting to multiple threads. The central part here is I/O de-multiplexing, i.e. a call to select(2) or poll(2) (or platform specific functions like epoll(7) or kqueue(2)).
Here's a brief introduction.