netty学习总结(一)

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

内容简介: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学习总结(一)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Transcending CSS

Transcending CSS

Andy Clarke、Molly E. Holzschlag / New Riders / November 15, 2006 / $49.99

As the Web evolves to incorporate new standards and the latest browsers offer new possibilities for creative design, the art of creating Web sites is also changing. Few Web designers are experienced p......一起来看看 《Transcending CSS》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

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

html转js在线工具