zoukankan      html  css  js  c++  java
  • 02_Netty实现的Echo服务器和客户端

    【Echo服务端】

    【EchoServer】

    public class EchoServer {
        private final int port;
    
        public EchoServer(int port) {
            this.port = port;
        }
    
        public static void main(String[] args) throws Exception {
            new EchoServer(9999).start();
        }
    
        public void start() throws Exception {
            NioEventLoopGroup group = new NioEventLoopGroup();
            try {
                ServerBootstrap b = new ServerBootstrap();   //创建ServerBootstrap
                b.group(group)
                        .channel(NioServerSocketChannel.class)   //指定NIO的传输Channel
                        .localAddress(new InetSocketAddress(port))
                        .childHandler(new ChannelInitializer<SocketChannel>() {
                            @Override
                            protected void initChannel(SocketChannel channel) throws Exception {
                                channel.pipeline().addLast(new EchoServerHandler());  //添加EchoServerHandler到Channel的ChannelPipeline
                            }
                        });
                ChannelFuture future = b.bind().sync();  //绑定服务器,sync等待服务器关闭
                System.out.println(EchoServer.class.getName() + " started and listen on " + future.channel().localAddress());
                future.channel().closeFuture().sync();
            } finally {
                group.shutdownGracefully().sync();
            }
        }
    
    }

    【EchoServerHandler】

    public class EchoServerHandler extends ChannelInboundHandlerAdapter {
    
        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
            ByteBuf  in = (ByteBuf)msg;
            System.out.println("Server received:"+in.toString(CharsetUtil.UTF_8));
            ctx.write(in);
        }
    
        @Override
        public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
            ctx.writeAndFlush(Unpooled.EMPTY_BUFFER)
                    .addListener(ChannelFutureListener.CLOSE);
        }
    
        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
            cause.printStackTrace();
            ctx.close();
        }
    
        @Override
        public void channelActive(ChannelHandlerContext ctx) throws Exception {
            System.out.println("Server is Active......");
        }
    
    
    }

    [ 说明 ] 

    Echo的Handler实现了服务器的业务,决定了连接创建以后和收到信息后该如何处理。

    ChannelInboundHandler的实现方法作用
    channelRead()         //每次收到信息都会回调
    channelReadComplete() //channelRead执行结束时回调
    exceptionCaught()     //执行异常情况下会被回调。

    【Echo客户端】

    【EchoClient】

    public class EchoClient {
    
        private final String host;
        private final int port;
    
        public EchoClient(String host, int port) {
            this.host = host;
            this.port = port;
        }
    
        public static void main(String[] args) throws Exception{
            new EchoClient("127.0.0.1",9999).start();
        }
    
        public void start() throws Exception{
            EventLoopGroup group = new NioEventLoopGroup();
            try{
                Bootstrap b = new Bootstrap();
                b.group(group)
                        .channel(NioSocketChannel.class)
                        .remoteAddress(new InetSocketAddress(host,port))
                        .handler(new ChannelInitializer<SocketChannel>() {
                            @Override
                            protected void initChannel(SocketChannel channel) throws Exception {
                                channel.pipeline().addLast(
                                        new EchoClientHandler()
                                );
                            }
                        });
                ChannelFuture future = b.connect().sync();
                future.channel().closeFuture().sync();
            }finally {
                group.shutdownGracefully();
            }
        }
    }

    【EchoClientHandler】

    public class EchoClientHandler extends SimpleChannelInboundHandler<ByteBuf> {
    
        @Override
        public void channelActive(ChannelHandlerContext ctx) throws Exception {
            System.out.println("client is active......");
            ctx.writeAndFlush(Unpooled.copiedBuffer("Netty rocks!", CharsetUtil.UTF_8));
        }
    
        @Override
        protected void channelRead0(ChannelHandlerContext channelHandlerContext, ByteBuf in) throws Exception {
            System.out.println("client received:"+ in.toString(CharsetUtil.UTF_8));
        }
    
        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
            cause.printStackTrace();
            ctx.close();
        }
    
    }

    【运行结果】

    [ 服务端 ]

    [ 客户端 ]

  • 相关阅读:
    POJ1061:青蛙的约会+POJ2115C Looooops+UVA10673Play with Floor and Ceil(扩展欧几里得)
    扩展欧几里得算法
    常用数学公式
    实训作业
    sdut 迷之容器(线段树+离散化)
    HDU1556:Color the ball(简单的线段树区域更新)
    HDU1698:Just a Hook(线段树区域更新模板题)
    32位的二进制数
    HDU5139:Formula(找规律+离线处理)
    HDU5023:A Corrupt Mayor's Performance Art(线段树区域更新+二进制)
  • 原文地址:https://www.cnblogs.com/HigginCui/p/10324585.html
Copyright © 2011-2022 走看看