Netty核心模块组件

Bootstrap ServerBootstrap

Bootstrap的意思是引导,一个Netty应用通常由一个Bootstrap开始,主要作用是配置整个Netty程序,串联各个组件,Netty的Bootstrap是客户端的引导开始类,ServerBootstrap是服务端的引导开始类。

常用的API有:

//该方法用于设置服务器端的BossGroup和WorkerGroup,第一个参数是BossGroup,第二个参数是WorkerGroup
public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup)

//该方法用于设置通道的类型,如果是服务端就设置NioServerSocketChannel,客户端就NioSocketChannel
public B channel(Class<? extends C> channelClass)

//设置BossGroup的通道的配置项,通常是一些tcp的配置,option是配置项,value是值。
public <T> B option(ChannelOption<T> option, T value)

//设置WorkerGroup的通道的配置项
public <T> ServerBootstrap childOption(ChannelOption<T> childOption, T value)

//用来设置WorkerGroup的Socketchannel的pipeline里面的处理器。通常添加自己的业务处理类
public ServerBootstrap childHandler(ChannelHandler childHandler)

//绑定地址。
public ChannelFuture bind(String inetHost, int inetPort)

//下面两个是Bootstrap常用,也会有上面的API在这个使用
//连接服务器。
public ChannelFuture connect(String inetHost, int inetPort)

//设置客户端的IO线程组。workerGroup
public B group(EventLoopGroup group)
Future、ChannelFuture

Netty中的所有IO操作都是异步的,不能立即得知消息是否被正确处理,所以可以使用这个并通过添加回调,使得可以在回调中进行处理。
如下代码:

public class ServerGroupChatServer {

    public  ConcurrentSkipListSet<SocketChannel> socketChannels = new ConcurrentSkipListSet();

    private  int port;

    public ServerGroupChatServer(int port){
        this.port = port;
    }


    public void start() throws InterruptedException {

        NioEventLoopGroup bossGroup = new NioEventLoopGroup();

        NioEventLoopGroup workerGroup = new NioEventLoopGroup();

        try {
            ServerBootstrap serverBootstrap = new ServerBootstrap();
            serverBootstrap.group(bossGroup,workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .option(ChannelOption.SO_BACKLOG,128)
                    .childOption(ChannelOption.SO_KEEPALIVE,true)
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel socketChannel) throws Exception {
                            //socketChannels.add(socketChannel);
                            //socketChannel.pipeline().addLast(new MyNettyChannelHandler(socketChannels));
                        }
                    });


            ChannelFuture bindFuture = serverBootstrap.bind("127.0.0.1", port);
            bindFuture.addListener(new GenericFutureListener<Future<? super Void>>() {
                @Override
                public void operationComplete(Future<? super Void> future) throws Exception {
                	//bindFuture是bind操作返回的返回值,在这里添加一个Listener后,当绑定成功后,会执行这个监听回调。
                	//像其他返回ChannelFuture的操作皆可如此做。
                    @Override
                public void operationComplete(Future<? super Void> future) throws Exception {
                    boolean success = future.isSuccess();
                    if (success)
                        System.out.println("服务绑定成功");
                    else{
                        System.out.println("服务绑定失败");
                    }
                }
                }
            });

            bindFuture.channel().closeFuture().sync();

        }finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }

    }

    public static void main(String[] args) throws InterruptedException {
        ServerGroupChatServer serverGroupChatServer = new ServerGroupChatServer(9898);
        serverGroupChatServer.start();
    }
}

future常见API:

//是否完成,完成就会触发监听回调,但是已完成不代表成功,也有可能失败
boolean isDone();
//是否执行成功
boolean isSuccess();

//是否可取消
boolean isCancellable();
//取消
boolean cancel(boolean var1);
//是否已经被取消
boolean isCancelled();

//添加一个监听器,当isDone方法
Future<V> addListener(GenericFutureListener<? extends Future<? super V>> var1);

//当发生异常时,返回具体异常。
Throwable cause();

//化异步为同步,也就是如果调用这个方法,会阻塞当前线程,直到异步任务完成。
ChannelFuture sync() throws InterruptedException;

//获取返回结果,这个方法是阻塞的,直到异步任务执行完成返回返回值,还有一些其他超时的重载方法。
V get()

//下面是channelFuture
//获取当前进行IO操作的通道
Channel channel();


结果:
在这里插入图片描述

channel
  1. 是Netty网络通信的组件,能够用于执行网络IO操作(读写等)。
  2. 通过Channel可以获得当前网络连接的通道状态。
  3. 通过Channel可以获得网络连接的配置参数。
  4. Channel提供了异步非阻塞的IO操作,异步非阻塞表示任何IO调用都将立即返回,不进行等待,并且不能保证IO操作能够立即完成,只能通过事件回调和事件监听来处理。
  5. 调用立即返回一个ChannelFuture实例,通过注册监听器到ChannelFuture上,可以对IO操作的成功/失败/取消等结果进行回调处理。

不同协议,对应的channel类型会有所不同。

  • NioServerSocketChannel :异步的服务端TCP Socket连接。
  • NioSocketChannel:异步的客户端TCP Socket连接。
  • NioDatagramChannel:异步的UDP连接。
  • NioSctpChannel:异步的客户端Sctp连接。
  • NioSctpServerChannel:异步的Sctp服务端连接。
Selector
  1. Netty基于Selector对象实现IO多路复用,通过Selector,一个线程可以监听多个channel事件。
  2. 当向一个Selector中注册了某个channel并且指定了相关感兴趣事件后,Selector内部机制就可以监控这些channel是否有就绪的IO事件(比如可读、可写等),并对相应发生事件进行处理,就可以实现一个程序处理多个Channel的情况。

剩下几个核心组件另开篇章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值