protected InternelListener makeReadableInternelListener(
			final ConnectedListener listener) {
		return new InternelListener() {
			@Override
			public void notifyListener(final SelectionKey key) {
				// temporary ignore the selection
				key.interestOps(key.interestOps() ^ SelectionKey.OP_READ);

				// async forward
				NIO.this.asyncs.offer(new Runnable() {
					@Override
					public void run() {
						// forward listener
						if (listener != null) {
							try {
								// forward the real read
								listener.notifyReadable((SocketChannel) key
										.channel());
							} catch (Exception e) {
								NIO.LOGGER.error(
										"fail to notify readable,cancel key:"
												+ key, e);
								NIO.this.cancelAndNotify(key, listener);
							}
						}

						// restore
						NIO.this.restoreKeyOrCancle(key, SelectionKey.OP_READ);
					}
				});
			}
		};
	}