EchoServer
public class EchoServer { private final int port; public EchoServer(int port) { this.port = port; } public static void main(String[] args) throws InterruptedException { int port = 9999; EchoServer echoServer = new EchoServer(port); System.out.println("服务器即将启动"); echoServer.start(); System.out.println("服务器关闭"); } public void start() throws InterruptedException { final EchoServerHandler serverHandler = new EchoServerHandler(); // 线程组 EventLoopGroup group = new NioEventLoopGroup(); try { //服务端启动必备 ServerBootstrap b = new ServerBootstrap(); b.group(group) //指定使用NIO的通信模式 .channel(NioServerSocketChannel.class) //指定监听端口 .localAddress(new InetSocketAddress(port)) .childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(serverHandler); } }); //异步绑定到服务器,sync()会阻塞到完成 ChannelFuture f = b.bind().sync(); //阻塞当前线程,直到服务器的ServerChannel被关闭 f.channel().closeFuture().sync(); } finally { group.shutdownGracefully().sync(); } }}
EchoServerHandler
@ChannelHandler.Sharablepublic class EchoServerHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { ByteBuf in = (ByteBuf)msg; System.out.println("Server accept: "+in.toString(CharsetUtil.UTF_8)); ctx.writeAndFlush(in); //ctx.close(); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { cause.printStackTrace(); ctx.close(); }}