@SuppressWarnings("synthetic-access")
 @Override
 public void sessionCreated(final IoSession session) throws Exception {
   InetSocketAddress local = (InetSocketAddress) session.getLocalAddress();
   int localPort = local.getPort();
   SshdSocketAddress remote = localToRemote.get(localPort);
   final TcpipClientChannel channel;
   if (remote != null) {
     channel = new TcpipClientChannel(TcpipClientChannel.Type.Direct, session, remote);
   } else {
     channel = new TcpipClientChannel(TcpipClientChannel.Type.Forwarded, session, null);
   }
   session.setAttribute(TcpipClientChannel.class, channel);
   service.registerChannel(channel);
   channel
       .open()
       .addListener(
           new SshFutureListener<OpenFuture>() {
             @Override
             public void operationComplete(OpenFuture future) {
               Throwable t = future.getException();
               if (t != null) {
                 DefaultTcpipForwarder.this.service.unregisterChannel(channel);
                 channel.close(false);
               }
             }
           });
 }
 @SuppressWarnings("synthetic-access")
 @Override
 public void sessionClosed(IoSession session) throws Exception {
   TcpipClientChannel channel =
       (TcpipClientChannel) session.getAttribute(TcpipClientChannel.class);
   if (channel != null) {
     log.debug("IoSession {} closed, will now close the channel", session);
     channel.close(false);
   }
 }
    @Override
    public void messageReceived(IoSession session, Readable message) throws Exception {
      TcpipClientChannel channel =
          (TcpipClientChannel) session.getAttribute(TcpipClientChannel.class);
      Buffer buffer = new ByteArrayBuffer();
      buffer.putBuffer(message);
      channel.waitFor(ClientChannel.OPENED | ClientChannel.CLOSED, Long.MAX_VALUE);

      OutputStream outputStream = channel.getInvertedIn();
      outputStream.write(buffer.array(), buffer.rpos(), buffer.available());
      outputStream.flush();
    }