netty——Channl的常用方法、ChannelFuture、CloseFuture

本文详细介绍了Netty中的Channel,包括其常用方法,如关闭、数据写入和刷出。同时,讲解了ChannelFuture在处理异步非阻塞connect()操作中的作用,以及如何通过sync()和addListener()解决异步问题。CloseFuture用于处理Channel关闭后的后续操作。最后,讨论了Netty为何使用异步以及异步如何提升吞吐量。
摘要由CSDN通过智能技术生成

Channel

Channel的常用方法

  • close() 关闭channel
  • closeFuture() 处理关闭channel后要执行的操作
    • sync()方法是同步等待channel的关闭
    • addListener()方法是异步等待channel的关闭
  • pipeline()添加处理器
  • write() 将数据写入,netty里面其实还有一个缓冲区,当我们执行flush()方法后或者是缓冲区中数据达到一个数量了就会将缓冲区的数据发送出去
  • writeAndFlush() 将数据写入并刷出

ChannelFuture

解决客户端连接服务器 connect()方法 异步非阻塞 问题

一个普通netty客户端的代码如下

public class HelloClient2 {
   
    public static void main(String[] args) throws InterruptedException {
   

        ChannelFuture channelFuture = new Bootstrap()
                .group(new NioEventLoopGroup())
                .channel(NioSocketChannel.class)
                .handler(new ChannelInitializer<NioSocketChannel>() {
   
                    @Override
                    protected void initChannel(NioSocketChannel socketChannel) throws Exception {
   
                        socketChannel.pipeline().addLast(new StringEncoder());
                    }
                })
                // 连接服务器  该方法返回的就是ChannelFuture
                .connect("localhost", 8080);

        // 这个sync()方法必须调用,如果不调用直接运行的话,下面发送给服务器的数据没有发送成功
        channelFuture.sync();
        Channel channel = channelFuture.channel();
        channel.writeAndFlush("aaa");
    }
}

为什么调用该方法channelFuture.sync();就能发送数据成功嘞?

这是因为上面一行连接服务器的代码.connect("localhost", 8080); 该方法是异步非阻塞的,主线程发起了连接服务器的操作,但是连接服务器是NioEventLoopGroup中的一个线程执行,如果不调用sync()方法就会出现还没有连接成功服务器,就执行了获取channel的语句并通过获取的channel发送数据,

以后我们看到Future 或者是 Promise 的类型都是和异步方法配套使用的,他俩的用途就是正确处理结果

上面出现了问题,解决方法也有几种:

  • 第一种就是调用ChannelFuture类中的sync()方法,主线程就会阻塞,当客户端与服务器连接成功后才会往下面执行,

  • 第二种解决 调用addListener() 异步处理结果

public static void main(String[] args) throws InterruptedException {
   

        ChannelFuture channelFuture = new Bootstrap()
                .group(new NioEventLoopGroup())
                .channel(NioSocketChannel.class)
                .handler(new ChannelInitializer<NioSocketChannel>() {
   
                    @Override
                    protected void initChannel(NioSocketChannel socketChannel) throws Exception {
   
                        socketChannel.pipeline().addLast(new StringEncoder());
                    }
                })
                // 连接服务器  该方法返回的就是ChannelFuture  该方法是异步非阻塞的
                .connect("localhost", 8080);

        // 第一种解决方法,方法同步处理结果,这里阻塞住,等客户端与服务器连接成功后在往下执行
//        channelFuture.sync();
//        Channel channel = channelFuture.channel();
//        channel.writeAndFlush("aaa");

// 第二种解决 调用addListener() 异步处理结果,上面的同步处理结果是主线程等另一个线程连接成功后再自己拿到连接成功的结果channel
// 然后自己发送数据。而这里的异步是主线程完全就是甩手掌柜,通过channel发送数据也让其他线程来做,主线程只是提供一个回调对象
// 当客户端与服务器连接成功后,EventLoop会自动调用ChannelFutureListener对象中的operationComplete()方
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值