content: package com.lgp.netty.netty_ch1;
  
  import io.netty.buffer.ByteBuf;
  import io.netty.buffer.Unpooled;
  import io.netty.channel.ChannelFutureListener;
  import io.netty.channel.ChannelHandler.Sharable;
  import io.netty.channel.ChannelHandlerContext;
  import io.netty.channel.ChannelInboundHandlerAdapter;
  import io.netty.util.CharsetUtil;
  
  
  /**
   * @author lgp
   */
  //标示一个ChannelHandler可以被多个 Channel 安全地共享
  @Sharable
  public class EchoServerHandler extends ChannelInboundHandlerAdapter {
      @Override
      public void channelRead(ChannelHandlerContext ctx, Object msg) {
          ByteBuf in = (ByteBuf) msg;
          //将消息记录到控制台
          System.out.println(System.currentTimeMillis() + " netty_ch1 Server received: " + in.toString(CharsetUtil.UTF_8));
          //将接收到的消息写给发送者，而不冲刷出站消息
          ctx.write(in);
      }
  
      @Override
      public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
          //将未决消息冲刷到远程节点，并且关闭该 Channel
          ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
      }
  
      @Override
      public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
          //打印异常栈跟踪
          cause.printStackTrace();
          //关闭该Channel
          ctx.close();
      }
  }
  