资讯专栏INFORMATION COLUMN

netty学习总结(一)

CntChen / 1955人阅读

摘要:是什么是一个异步的,事件驱动的网络编程框架。责任链模式通过将组装起来,通过向里添加来监听处理发生的事件。相比于的的不仅易用,而且还支持自动扩容。入站入站事件一般是由外部触发的,如收到数据。

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(){
            // 设置客户端套接字的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(){
            // 设置客户端套接字的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:

在JVM堆上分配的buffer。优点是分配快速,易于回收,缺点是最终还是要将数据复制到直接缓存中

直接缓冲区,直接通过系统调用malloc分配的内存,优点是减少数据移动,缺点是分配慢,回收麻烦

组合缓冲区,即将不同种类的buffer进行封装,访问时就像访问一个buffer,可以通过这个方式对缓冲区进行划分,但是会增加访问时间

handler

handler分为处理入站事件的handler和出站事件的handler。通过实现相应的方法来监听相应的事件
netty也提供了一些adapter类来减少开发者的工作量。

入站handler

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

出栈handler

出站事件由内部触发,如写数据
基类为ChannelOutboundHandler

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77618.html

相关文章

  • 慕课网_《Netty入门之WebSocket初体验》学习总结

    时间:2018年04月11日星期三 说明:本文部分内容均来自慕课网。@慕课网:https://www.imooc.com 教学源码:https://github.com/zccodere/s... 学习源码:https://github.com/zccodere/s... 第一章:课程介绍 1-1 课程介绍 什么是Netty 高性能、事件驱动、异步非阻塞的IO Java开源框架 基于NIO的客户...

    Noodles 评论0 收藏0
  • 少啰嗦!分钟带你读懂Java的NIO和经典IO的区别

    摘要:的选择器允许单个线程监视多个输入通道。一旦执行的线程已经超过读取代码中的某个数据片段,该线程就不会在数据中向后移动通常不会。 1、引言 很多初涉网络编程的程序员,在研究Java NIO(即异步IO)和经典IO(也就是常说的阻塞式IO)的API时,很快就会发现一个问题:我什么时候应该使用经典IO,什么时候应该使用NIO? 在本文中,将尝试用简明扼要的文字,阐明Java NIO和经典IO之...

    Meils 评论0 收藏0
  • Netty 框架总结「ChannelHandler 及 EventLoop」

    摘要:随着状态发生变化,相应的产生。这些被转发到中的来采取相应的操作。当收到数据或相关的状态改变时,这些方法被调用,这些方法和的生命周期密切相关。主要由一系列组成的。采用的线程模型,在同一个线程的中处理所有发生的事。 「博客搬家」 原地址: 简书 原发表时间: 2017-05-05 学习了一段时间的 Netty,将重点与学习心得总结如下,本文主要总结ChannelHandler 及 E...

    VioletJack 评论0 收藏0
  • 位大佬的亲身经历总结:简历和面试的技巧

    摘要:我觉得了解简历和面试的技巧可以帮助你更好的去学习重要的知识点以及更好地去准备面试以及面试,说实话,我个人觉得这些东西还挺重要的。在本文里,我将介绍我这段时间里更新简历和面试的相关经历。 分享一篇很不错的文章!本文作者曾经写过《Java Web轻量级开发面试教程》和 《Java核心技术及面试指南》这两本书。我觉得了解简历和面试的技巧可以帮助你更好的去学习重要的知识点以及更好地去准备面试以...

    pingan8787 评论0 收藏0
  • Netty 4.1 源代码学习:线程模型

    摘要:前言本文以自带的示例工程为例,简要介绍线程模型示例工程的代码位于很简单,仅包含一个方法用于初始化以及,我们来看看其中和线程模型相关的一些代码在的初始化代码中实例化了两个对象和,它们有着公共基类,这个是线程模型的核心类名让人联想到组合模式, 前言 本文以 netty 4.1 自带的示例工程 netty-example 为例,简要介绍 netty 线程模型 EchoServer echo ...

    monw3c 评论0 收藏0

发表评论

0条评论

CntChen

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<