public synchronized boolean start() throws IOException {
// verify we haven't already started
if(nioDaemon != null) throw new IllegalStateException();
// start the nio daemon
nioDaemon = new NIODaemon();
nioDaemon.start();
// start the server
try {
nioDaemon.invokeAndWait(new StartServer(this, listenPort));