Netty的简介

Netty是一个java开源框架,是基于NIO的高性能、高可扩展性的异步事件驱动的网络应用框架,简化了TCP、UDP服务器和客户端的网络编程。

很多开源的项目,底层都使用了Netty,例如Dubbo、Elasticsearch、Facebook等,其他的支持者,请进入https://netty.io/wiki/adopters.html查看。

Netty的特性

设计层面:

  1. 提供了统一的API,支持多种传输类型,阻塞的和非阻塞的
  2. 简单、强大的线程模型
  3. 基于灵活且可扩展的事件模型,可以清晰地分离关注点
  4. 真正的无连接数据报套接字支持

使用层面:

  1. 有非常完善的javadoc文档和丰富的实例代码作为参考
  2. 不需要其他的依赖,JDK5(Netty3.0)或者JDK6(Netty4.0)就足够了

性能层面:

  1. 拥有比JAVA的核心API更高的吞吐量和更低的延迟
  2. 拥有更低的资源消耗
  3. 最小化不必要的内存复制

安全层面:

  1. 完整的SSL/TLS和StartTLS支持

社区层面:

  1. 社区发布快速而且比较频繁,不用担心出现问题,无从解决

Netty的整体结构



1:支持Socket、HTTP等多种传输方式

2:提供了多种协议的编码、解码实现

3:核心部分:事件处理模型、API、BUffer的增强

Netty的核心组件

1:Channel,Netty自己定义了Channel,对其进行了增强

2:EventLoop,由线程驱动的,处理Channel的I/O事件

3:ChannelPipeline,事件处理机制,也叫做职责链

4:ChannelHandler,事件处理器

5:ByteBuf,增强版的缓冲区

6:BootStrap,启动器

Netty的线程模型

        //老板线程组
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
//员工线程组
EventLoopGroup workerGroup = new NioEventLoopGroup();
final EchoServerHandler serverHandler = new EchoServerHandler();
try {
ServerBootstrap b = new ServerBootstrap();
//配置启动器
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 100)
.handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline p = ch.pipeline();
if (sslCtx != null) {
p.addLast(sslCtx.newHandler(ch.alloc()));
}
//p.addLast(new LoggingHandler(LogLevel.INFO));
p.addLast(serverHandler);
}
}); //启动启动器
ChannelFuture f = b.bind(PORT).sync();
//关闭服务
f.channel().closeFuture().sync();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}



1:bossGroup就是一个线程,接收客户端连接,然后注册到workerGroup,分配给workerGroup中的线程

2:workerGroup主要是用来处理客户端连接的I/O操作的,里面有多个线程,线程的数量一般默认为CPU核心数*2,每个线程都有一个Selector用来监听客户端事件的发生,Selector会轮询的去看有没有事件

3:workerGroup中每个线程里,都有一个queue队列,当Selector轮询中没有事件,也就是当该线程空闲的时候,会去处理queue中的任务

结束语

本篇内容主要是介绍Netty的一些知识,下一篇会写下EventLoopGroup和Channel相关的东西

网络编程Netty入门:Netty简介及其特性的更多相关文章

  1. Netty入门(1) - 简介

    什么是Netty? Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架. Tomcat和Netty有什么区别? Netty和Tom ...

  2. socket 网络编程高速入门(一)教你编写基于UDP/TCP的服务(client)通信

    由于UNIX和Win的socket大同小异,为了方便和大众化,这里先介绍Winsock编程. socket 网络编程的难点在入门的时候就是对基本函数的了解和使用,由于这些函数的结构往往比較复杂,參数大 ...

  3. 浅谈iOS网络编程之一入门

    计算机网络,基本上可以抽象是端的通信.实际在通讯中会用到不同的设备,不同的硬件中,为了能友好的传输信息,那么建立一套规范就十分必要了.先来了解一些基本概念 了解网络中传输的都是二进制数据流.  2.了 ...

  4. ios网络编程(入门级别)-- 基础知识

    在学习ios的过程中,停留在UI控件很长时间,现在正在逐步的接触当中!!!!!!在这个过程中,小编学到了一些关于网络编程知识,并且有感而发,在此分享一下: 关于网络请求的重要性我想不用多说了吧!!!对 ...

  5. UNIX网络编程读书笔记:简介

    认知套接口编程接口 理解原始套接口(raw socket)的概念   值得注意的是,客户和服务器是典型的用户进程,而TCP和IP协议则通常是系统内核协议栈的一部分. 上图中在TCP和UDP之间留有间隙 ...

  6. linux下网络编程学习——入门实例ZZ

    http://www.cppblog.com/cuijixin/archive/2008/03/14/44480.html 是不是还对用c怎么实现网络编程感到神秘莫测阿,我们这里就要撕开它神秘的面纱, ...

  7. 《Unix网络编程》卷一(简介TCP/IP、基础套接字编程)

    通常说函数返回某个错误值,实际上是函数返回值为-1,而全局变量errno被置为指定的常值(即称函数返回这个错误值). exit终止进程,Unix在一个进程终止时总是关闭该进程所有打开的描述符. TCP ...

  8. UNIX网络编程——epoll 系列函数简介、与select、poll 的区别

    前面博客<<UNIX环境高级编程--epoll函数使用详解>>有关于epoll函数的讲解. 一.epoll 系列函数简介 #include <sys/epoll.h> ...

  9. Java网络编程从入门到精通(27):关闭服务端连接

    在客户端和服务端的数据交互完成后,一般需要关闭网络连接.对于服务端来说,需要关闭Socket和ServerSocket. 在关闭Socket后,客户端并不会马上感知自已的Socket已经关闭,也就是说 ...

  10. 网络编程2之Socket简介和java.net包

    一.Socket 通信链路的端点就被称为"套接字"(英文名Socket) 是提供给应用程序的接口 图文说明Socket Socket通信原理 二.java.net包 Java.ne ...

随机推荐

  1. IO多路复用之select、poll、epoll

    本文转载自IO多路复用之select.poll.epoll 导语 IO多路复用:通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. ...

  2. MySQL数据库与NAVICAT安装与配置

    1.安装破解版的NAVICAT:https://www.cnblogs.com/yinfei/p/11427259.html 2.连接MYSQL 下载MYSQL并安装,配置环境变量 以管理员身份运行C ...

  3. c# winform中窗体切换后释放及防止重复生成

    问题1:窗体切换后如何关闭,并释放资? c# winform中,2个窗体,form1和form2,互相切换的时候执行 this.Hide(); Form2 form2 = new Form2(); f ...

  4. DisplayFormat属性

    DataFormatString="{0:格式字符串}" 在DataFormatString 中的 {0} 表示数据本身,而在冒号后面的格式字符串代表所们希望数据显示的格式: 数字 ...

  5. 痞子衡嵌入式:FlexSPI复位方式不当会导致i.MXRT系列下OTFAD加密启动失败

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是FlexSPI复位方式不当会导致i.MXRT系列下OTFAD加密启动失败问题. 本篇是<系统时钟配置不当会导致i.MXRT1xxx ...

  6. 【Android笔记】Thread类中关于join()方法的源码分析

    1.join()方法的作用: 例如有一个线程对象为Thread1,在main()方法中调用Thread1.join()方法可使得当前线程(即主线程)阻塞,而执行Thread1线程. 2.源码分析(以上 ...

  7. pytorch(05)计算图

    张量的一系列操作,增多,导致可能出现多个操作之间的串行并行,协同不同的底层之间的协作,避免操作的冗余.计算图就是为了解决这些问题产生的. 计算图与动态图机制 1. 计算图 计算图用来描述运算的有向无环 ...

  8. 修改 Hosts 解决 Github 访问缓慢问题

    背景 最近访问 Github 经常出现访问速度慢的问题,甚至会出现无法连接的情况.有一天,在一次家常聊天中提到了这个事情,有一位热心的 Gitee 朋友就说:你改一下 Hosts 文件就可以了.修改了 ...

  9. 微信小程序在Android和Ios端的获取时间兼容性问题

    an端 var time = new Date() 例如:2020-01-01 01:01:00   ios端 var time = new Date() 例如:2020/01/01 01:01:00 ...

  10. ajax轮询原理及其实现方式

    ajax轮询原理及其实现方式 ajax轮询的两种方式 方式1:设定一个定时器,无论有无结果返回,时间一到就会继续发起请求,这种轮询耗费资源,也不一定能得到想要的数据,这样的轮询是不推荐的. 方式2: ...