2020-04-20

netty 中创建服务流程

  1. 自定义Handler继承ChannelInboundHandlerAdapter 标记该类@ChannelHandler.Sharable (channel共享)

重写channelRead方法

  /**
     * 当前的 Channel 已从对等方读取消息时调用。
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

        ByteBuf byteBuf = (ByteBuf) msg;

        System.out.println("Echo server send :" + byteBuf.toString(Charset.defaultCharset()));

        ctx.write(byteBuf);

    }

重写 channelReadComplete 方法

/**
     * 读完成后 调用
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {

        ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);

    }

重写 exceptionCaught 方法


/**
     * 异常是调用
     * @param ctx
     * @param cause
     * @throws Exception
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }

2.创建 EventLoopGroup
4.创建 ServerBootstrap
5.指定使用 NIO 的传输 Channel
6.设置 socket 地址使用所选的端口
7.添加 EchoServerHandler 到 Channel 的 ChannelPipeline
8.绑定的服务器;sync 等待服务器关闭
9.关闭 channel 和 块, 直到它被关闭
10.关闭 EventLoopGroup, 释放所有资源

  public void start() throws Exception {
        NioEventLoopGroup group = new NioEventLoopGroup();

        try {
            ServerBootstrap bootstrap = new ServerBootstrap();

            bootstrap.group(group)
                    .channel(NioServerSocketChannel.class)
                    .localAddress(port)
                    .childHandler(new ChannelInitializer() {
                        @Override
                        public void initChannel(SocketChannel socketChannel) throws Exception {
                            socketChannel.pipeline().addLast(new EchoServerHandler());
                        }
                    });

            ChannelFuture future = bootstrap.bind().sync();
            System.out.println(this.getClass().getName() + " started and listen on " +
                    future.channel().localAddress());

            future.channel().closeFuture().sync();
        } finally {
            group.shutdownGracefully().sync();
        }

    }
  • Netty核心组件
    Bootstrap 和 ServerBootstrap
    Channel
    ChannelHandler
    ChannelPipeline
    EventLoop
    ChannelFuture

channel中的方法

方法名称 描述
eventLoop() 返回分配给Channel的EventLoop
pipeline() 返回分配给Channel的ChannelPipeline
isActive() 返回Channel是否激活, 已激活说明与远程连接对等
localAddress() 返回已绑定的本地SocketAddress
remoteAddress() 返回已绑定的远程SocketAddress
write() 写数据到远程客户端, 数据通过ChannelPipeline传输过去
flush() 刷新先前的数据
writeAndFlush(…) 一个方便的方法用户调用write(…)而后调用 flush()

你可能感兴趣的:(2020-04-20)