@Override
 public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) {
   final NioSocketChannel ch = (NioSocketChannel) e.getChannel();
   final DefaultNetSocket sock = socketMap.remove(ch);
   if (sock != null) {
     sock.getContext()
         .execute(
             new Runnable() {
               public void run() {
                 sock.handleClosed();
               }
             });
   }
 }
 @Override
 public void channelInterestChanged(ChannelHandlerContext ctx, ChannelStateEvent e)
     throws Exception {
   final NioSocketChannel ch = (NioSocketChannel) e.getChannel();
   final DefaultNetSocket sock = socketMap.get(ch);
   ChannelState state = e.getState();
   if (state == ChannelState.INTEREST_OPS) {
     sock.getContext()
         .execute(
             new Runnable() {
               public void run() {
                 sock.handleInterestedOpsChanged();
               }
             });
   }
 }