IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 通信框架之Netty第一话 - NIO的超神发展之路 -> 正文阅读

[Java知识库]通信框架之Netty第一话 - NIO的超神发展之路

1.什么是IO

IO是计算机中的信息交换机制,分表对应Input:输出(读)Output:输入(写)
IO有两大类,本地IO:

  • 字节流:InputStream/OutputStream
  • 缓冲流:Reader/Writer

网络IO:

  • interAddress ip:port tcp协议,Udp协议
  • ServerSocket/Socket

Java中的File OutputStream/InputStream操作

public static void main(String[] args) throws Exception {
    File file = new File("/test/123.txt");
    //写入流 写入数据
    FileOutputStream outputStream = new FileOutputStream(file);
    outputStream.write("123456".getBytes());
    outputStream.write("\n78901".getBytes());
    outputStream.write("\nasdfdf".getBytes());
    outputStream.flush();
    outputStream.close();

    StringBuilder builder = new StringBuilder();
    int len;
    byte[] bytes = new byte[1024];
    //读取文本中数据
    FileInputStream inputStream = new FileInputStream(file);
    while ((len = inputStream.read(bytes)) != -1) {
        builder.append(new String(bytes, 0, len));
    }
    inputStream.close();
    System.out.println(builder.toString());
}

上述是最原始的流操作案例,其他的封装可以使用BufferedWriter、BufferedReader等等
需要注意的是使用的Stream一定要记得关闭。不然会出现文件死锁问题

IO的演变历史:

  • BIO(block IO,单核处理,串行,阻塞IO) -> NIO(new io/no block,netty框架就是NIO) -> AIO(异步IO)

2.Netty介绍

Netty是一个基于异步、事件驱动的网络应用程序框架,用于快速开发高性能、高可靠性的网络IO程序,是目前最流行的NIO框架。Netty在互联网领域,大数据分布式计算,游戏行业,通信IM行业获得了广泛的应用。

Dubbo、RocketMQ、Tomcat等内部都采用了Netty。

3.Netty的优势

现在知道了Netty是一个高性能的底层通信框架,那来分析一下原生NIO存在的问题

  • NIO的类库和API太过繁杂
  • 需要熟悉多线程编程,因为NIO编程涉及到Reactor模式。必须对多线程和网络编程非常熟悉,才能写出高质量的NIO程序
  • 开发难度、工作量比较大,例如:网络重连,丢包、阻塞等处理非常难
  • JDK NIO有个Epoll bug,会导致Selector空轮询,导致CPU100%

接下来在分析一下为什么用Netty

  • Netty对自带的JDK NIO的API进行了封装,解决了上述问题
  • 设计理念很符合各种传输类型的统一(API阻塞和非阻塞Socket),基于灵活且可扩展的事件模型,清晰的分离关注点,高度可定制的线程模型(单线程,线程池)
  • 使用更加方便,没有其他依赖
  • 高性能,吞吐量更高,延迟更低。减少资源消耗,最小化内存复制
  • 对各种协议的全面支持,例如HTTP

Netty的三大组件

  • Buffer数据缓冲区、Channel轮询处理(中心的调度器)、Selecttor数据通道

4.Netty的操作流程

  • NIOEventLoop监听端口
  • Channel建立新的连接
  • 通过ByteBuf接收数据
  • 通过Pipeline处理链路,每个链路都是一个ChannelHandler,每个handler都有自己的处理逻辑
  • 通过ByteBuf返回数据

结构图分析

common
buffer
实现了自己的ByteBuffer,比JDK的强大很多
codec
扩展,包含了非常常见的协议编码解码器的实现
handler
内置连接通道处理器,channelhandle的所有实现
transport
网络传输通道的定义与实现,包括网络通信和事件模型

5.Netty中的channel简介

主要列举TCP的操作API,其他的大概举例

  • TCP
BIO同步阻塞NIO同步非阻塞Netty异步非阻塞Netty同步阻塞
客户端SocketSocketChannelNioSocketChannelOioSocketChannel
服务端ServerSocketServerSocketChannelNioServerSocketChannelOioServerSocketChannel
  • UDP: NioDatagramChannel
  • SCTP: NioStcpChannel

6.Netty的特性

  • 异步和事件驱动的高性能网络通信框架
  • 快速用于高性能服务端和客户端
  • 自带编解码解决拆包粘包问题,开发者只关心业务逻辑
  • Reactor线程模型设计支持海量高并发连接
  • 自带Http、WebSocket常用协议,处理起来不用再开发解析代码
  • 将业务和网络逻辑解耦。模块化和可复制性大大提高

本文主要先了解Netty的理论知识,下节开始用Netty编写一些常用协议以便更快了解Netty!
以上就是本章的全部内容了。

上一篇:mysql第十话 - mysql+springboot之sharding-JDBC分表分库实战
下一篇:通信框架之Netty第二话 - Netty的使用以及手写一个Tomcat

路漫漫其修道远,吾将上下而求索

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-28 11:39:48  更:2022-04-28 11:43:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:03:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码