public void go() throws Exception {
		int port = PORT_NUMBER;
		
		System.out.println("Listening on port " + port);
		
		//Allocate an unbound server socket channel
		ServerSocketChannel serverChannel = ServerSocketChannel.open();
		//Get the associated ServerSocket to bind it with
		ServerSocket serverSocket = serverChannel.socket();
		//Create a new Selector for use below
		Selector selector = Selector.open();
		
		//Set the port the server channel will listen to
		serverSocket.bind(new InetSocketAddress(port));
		
		//Set nonblocking mode for the listening socket
		serverChannel.configureBlocking(false);
		
		//Register the ServerSocketChannel with the Selector
		serverChannel.register(selector, SelectionKey.OP_ACCEPT);
		
		while(true) {
			//This may block for a long time. Upon returning, the
			//selected set contains keys of the ready channels
			int n = selector.select();
			
			if(n == 0)
				continue; //nothing to do
			
			//Get an iterator over the set of selecetd keys
			Iterator iterator = selector.selectedKeys().iterator();
			while(iterator.hasNext()) {
				SelectionKey key = (SelectionKey) iterator.next();
				
				//Is a new connection coming in?
				//We know the key is a ServerSocket b/c only ServerSockets can have the OP_ACCEPT interest
				if(key.isAcceptable()) {
					ServerSocketChannel server = (ServerSocketChannel) key.channel();
					SocketChannel channel = server.accept();
					
					//Register the socket channel with the selector
					//We're interested in knowning when the new socket channel is ready for reading
					//by passing in the OP_READ flag
					registerChannel(selector, channel, SelectionKey.OP_READ);
					
					//sayHello(channel);
				}
				
				//Is there data to be read on this channel
				if(key.isReadable()) {
					readDataFromSocket(key);
				}
				
				//Remove key from selected set; it's been handled
				iterator.remove();
			}
		}
	}