netty学习总结(一)

栏目: 编程工具 · 发布时间: 5年前

内容简介:netty是一个异步的,事件驱动的网络编程框架。netty是对使用Java IO进行网络编程,一般一个用户一个线程,无法处理海量用户

netty学习总结(一)

netty是什么?

netty是一个异步的,事件驱动的网络编程框架。

netty的技术基础

netty是对 Java NIOJava线程池 技术的封装

netty解决了什么问题

使用Java IO进行网络编程,一般一个用户一个线程,无法处理海量用户

使用Java NIO进行网络编程,编程复杂性太高,如果没有深厚的NIO网络编程基础,写出的程序可能还不如Java IO写的程序

至于Java AIO,目前还没有弄清楚其与netty孰优孰劣

netty架构

netty架构是基于Reactor和责任链模式进行设计的。

reactor

关于reactor的原理,参考“ 【NIO系列】——之Reactor模型

netty的reactor是多reactor多线程模型,其中reactor在netty中以eventloop的形式出现。

责任链模式

netty通过popeline将handler组装起来,通过向pipeline里添加handler来监听处理发生的事件。

netty服务端编程模式

// 用于监听客户端链接的eventloop池,一般只有一个eventloop
NioEventLoopGroup bossGroup = new NioEventLoopGroup();
// 用于处理客户端IO的eventloop池
NioEventLoopGroup workGroup = new NioEventLoopGroup();
// 辅助类,帮助初始化服务器
ServerBootStrap bootstrap = new ServerBootStrap();
bootstrap.group(bossGroup, workGroup) // bossGroup和workGroup可以是同一个
        .channel(NioServerSocketChannel.class) // 设置服务端监听套接字的channel类型
        .option(ChannelOption.SO_BACKLOG, 1024) // 设置监听套接字的参数
        .handler(new LoggingHandler()) // 设置监听套接字的handler
        .childHandler(new ChannelInitializer<SocketChannel>(){
            // 设置客户端套接字的handler
            public void initChannle(SocketChannel ch){
                // 向pipleline中添加handler,用于处理客户端IO
                ch.pipeline().addLast(...); 
            }
        });
int port = 8080;
try{
    ChannelFuture f = bootstrap.bind(port).sync();
    f.channel().closeFuture().sync();
}catch(IOException e){
    e.printStacktrac();
}finally{
    bossGroup.shutdownGracefully();
    workGroup.shutdownGracefully();
}

netty客户端编程模型

// 用于处理与服务端IO的eventloop池
NioEventLoopGroup group = new NioEventLoopGroup();
// 辅助类,帮助初始化客户端
BootStrap bootstrap = new BootStrap();
bootstrap.group(group)
        .channel(NioSocketChannel.class) // 设置客户端套接字的channel类型
        .option(ChannelOption.NO_DELAY, true) // 设置客户端套接字的参数
        .handler(new ChannelInitializer<SocketChannel>(){
            // 设置客户端套接字的handler
            public void initChannel(SocketChannel ch){
                // 向pipleline中添加handler,用于处理客户端IO
                ch.pipeline().addLast(...); 
            }
        });
String host = "127.0.0.1";
int port = 8080;
try{
    ChannelFuture f = bootstrap.connect(host, port).sync();
    f.channel().closeFuture().sync();
}catch(IOException e){
    e.printStacktrac();
}finally{
    group.shutdownGracefully();
}

buffer

netty认为Java NIO的Buffer太难用了,因此自己实现了一套Buffer。相比于Java NIO的netty的buffer不仅易用,而且还支持自动扩容。

netty的buffer可以抽象为三个指针readIndex, writeIndex, limit.

读buffer增加readIndex,写buffer会增加writeIndex,如果写的数据量超过limit,则会增加buffer容量。netty buffer也支持随机读写

netty中buffer一般通过Unpooled工具类创建,有三大类buffer:

  1. 在JVM堆上分配的buffer。优点是分配快速,易于回收,缺点是最终还是要将数据复制到直接缓存中
  2. 直接缓冲区,直接通过系统调用malloc分配的内存,优点是减少数据移动,缺点是分配慢,回收麻烦
  3. 组合缓冲区,即将不同种类的buffer进行封装,访问时就像访问一个buffer,可以通过这个方式对缓冲区进行划分,但是会增加访问时间

handler

handler分为处理入站事件的handler和出站事件的handler。通过实现相应的方法来监听相应的事件

netty也提供了一些adapter类来减少开发者的工作量。

入站handler

入站事件一般是由外部触发的,如收到数据。

基类为 ChannelInboundHandler

出栈handler

出站事件由内部触发,如写数据

基类为 ChannelOutboundHandler


以上所述就是小编给大家介绍的《netty学习总结(一)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

啊哈C语言!逻辑的挑战(修订版)

啊哈C语言!逻辑的挑战(修订版)

啊哈磊 / 电子工业出版社 / 2017-1 / 49

《啊哈C语言!逻辑的挑战(修订版)》是一本非常有趣的编程启蒙书,《啊哈C语言!逻辑的挑战(修订版)》从中小学生的角度来讲述,没有生涩的内容,取而代之的是生动活泼的漫画和风趣幽默的文字。配合超萌的编程软件,《啊哈C语言!逻辑的挑战(修订版)》从开始学习与计算机对话到自己独立制作一个游戏,由浅入深地讲述编程的思维。同时,与计算机展开的逻辑较量一定会让你觉得很有意思。你可以在茶余饭后阅读《啊哈C语言!逻......一起来看看 《啊哈C语言!逻辑的挑战(修订版)》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

随机密码生成器
随机密码生成器

多种字符组合密码

html转js在线工具
html转js在线工具

html转js在线工具