一.netty入门到超神系列-bionioaio的认识

墨家巨子@俏如来 墨家巨子@俏如来     2022-12-15     145

关键词:

前言

本文章是《Netty入门到超神系列》第一章,主要介绍java的三大I/O模型:BIO,NIO,AIO,因为Netty采用了NIO模型,要透彻Netty就得懂NIO原理,NIO又是在BIO基础进行演变,所以我们得对这些I/O都要有一些了解。

I/O概述

I/O其实是Input,Output的缩写,意思是输入和输出,比如:把磁盘中的一个文件读入Java内存中,站在Java内存的角度来看就是输入即input, 可以使用Java提供的输入流如:InputStream#read 来实现。如果是把一个段文本内容从Java内存中保存到磁盘上的某个文件,站在Java内存的角度来说就是输出,可以使用Java提供的输出流:OutputStream#write() 来实现。再比如把一个数据通过网络发送给其他服务器就是输出,或者从其他服务器接收一段数据就是输入。

I/O也是有很多种的,比如Java支持三种:BIO,NIO,AIO

BIO理解

BIO被称为 Blocking I/O,是同步并阻塞型IO,服务器实现模式为一个连接一个线程,我们以client / server 为例, 当Client客户端向 Server发起一个请求,Server就会创建一个线程来处理这个请求,如果该线程没有读取到数据,就会一直阻塞在这,等待客户端发送数据,这会造成不必要的线程开销,当并发大的时候会创建大量的线程,比较占用系统资源。优化方案是使用线程池。BIO模型示意图:

BIO是Java传统的IO模型,InputStream,OutputStream等输入输出流都是基于BIO,问题也比较明显,即:一个请求一个线程比较占用资源,另外当read()不到数据时线程会阻塞,导致性能达不到最优,所以BIO适用于并发连接少的业务场景。优点是程序简单容易理解。

NIO理解

NIO是non-blocking I/O 或者 New IO ,是同步非阻塞的IO模型,实现模式是一个线程处理多个请求,客户端发送的请求都会交给多路复用器去处理,多路复用器采用轮询机制,轮询到连接有IO请求就创建线程进行处理。NIO采用非阻塞机制,当线程读取不到客户端发送的数据也不会阻塞,这样该线程就可以做其他的事情。

BIO 和 NIO 的区别

  • BIO以流的方式处理数据,NIO以块(buffer)的方式处理数据,块的IO效率高于流的IO效率
  • BIO是阻塞IO,NIO是非阻塞IO
  • BIO使用字符流,或者字节流进行操作,NIO基于channel通道和buffer缓冲区进行操作
  • BIO适用于并发低的业务场景,NIO适用于并发高的业务场景

AIO理解

AIO: NIO.2,或称为AIO(Asynchronous I/O),是异步非阻塞IO是对NIO的增强,AIO 引入异步通道的概念,采用了 Proactor 模式,简化了程序编写,有效的请求才启动线程,它的特点是先由操作系统完成后才通知服务端程序启动线程去处理,一般适用于连接数较多且连接时间较长的应用。 这种IO尚不稳定,这里不做过多介绍。

十.netty入门到超神系列-基于netty群聊系统(代码片段)

前言本章节基于Netty做一个聊天室案例加强Netty的熟练度,案例的效果是服务端可以广播某客户端的消息给所有客户端。每个客户端监听键盘输入来获取消息,然后发送给服务端。服务端服务端一样的需要创建BossGroup和Work... 查看详情

七.netty入门到超神系列-netty介绍和线程模型

前言千呼万唤始出来,经过5章的NIO学习,终于迎来了Netty,本章主要是对Netty做一个介绍和Netty的线程模型做一个分析。撸起袖子,准备好卫生纸,一起来看吧。JavaNIO的问题经过前面章节的学习你应该能感受到... 查看详情

九.netty入门到超神系列-netty开发http服务器(代码片段)

前言这章我们使用Netty来写一个Http服务器类似于Tomcat,当然Netty和Tomcat是有很多的异同的,比如通信协议,Tomcat是一个基于Http协议的Web容器,而Netty能够通过codec自己来编码/解码字节流,因此Netty可以通过编程自定... 查看详情

二.netty入门到超神系列-javanio三大核心(selector,channel,buffer)(代码片段)

前言上一章节我们认识了一下Java的三大IO,这一章节我们详细了解一下NIO的工作原理以及三大核心Selector,Channel,Buffer并尝试来做一些小案例。JavaNIO模型JavaNIO有三个核心的组件:selector选择器,channel通道,buffer缓冲... 查看详情

五.netty入门到超神系列-零拷贝技术(代码片段)

文章目录前言物理内存和虚拟内存内核空间和用户空间DMA传输原理传统IO流程DMAIO流程DMA的问题零拷贝技术MMAP模式Sendfile模式Sendfile+DMA优化Splice缓冲区共享总结前言本篇文章我们来探讨一下Linux中的几种“零拷贝”技术,我... 查看详情

六.netty入门到超神系列-javanio零拷贝实战(代码片段)

前言这一章我们来操作一下NIO的零拷贝,这里我会先写代码样式一下传统IO数据拷贝场景下的耗时,然后再对比NIO场景下的考别耗时,通过耗时差异就能看到NIO零拷贝和传统IO拷贝的区别了。传统IO拷贝服务端服务端主... 查看详情

三.netty入门到超神系列-聊天室案例(代码片段)

前言前面我们对NIO的三大核心做了学习,这章我们来基于NIO来做一个聊天室案例。聊天室案例先来看下我们要实现的效果对于服务端而言需要做如下事情selector监听客户端的链接如果有“读”事件,就从通道读取数据把数... 查看详情

十一.netty入门到超神系列-netty使用protobuf编码解码(代码片段)

前言数据在网络传输的过程中需要序列化或和反序列化,也就需要用到编码器和解码器,本篇文章主要是探讨Netty中的编码解码器以及Protobuf的使用。Netty中的编码解码当我们的Netty客户端和服务端进行通信时数据在传输的... 查看详情

十.netty入门到超神系列-基于websocket开发聊天室(代码片段)

前言在很多的网站中都嵌入有聊天功能,最理想的方式就是使用WebSocket来开发,屏幕面前的你如果不清楚WebSocket的作用可以自己去百度一下,Netty提供了WebSocket支持,这篇文章将使用Netty作为服务器,使用WebSock... 查看详情

三.netty入门到超神系列-javanio三大核心(selector,channel,buffer)(代码片段)

前言上一章节我们理解了JavaNIO三大核心,以及重点讲解了Buffer的原理和几个使用场景,其中也用到了channel。这一章我们来理解一下selector,结合channel来做一个c/s通信。理解Selector和ChannelSelector选择器,也叫多路复用器&... 查看详情

十三.netty入门到超神系列-手撸简单版rpc框架(仿dubbo)(代码片段)

前言学过dubbo的应该知道dubbo底层基于Netty实现,为了加强对Netty的理解,这篇文章我们来仿照dubbo手撸一个简易版本的RPC框架结构理解先来看一张图原理还是比较简单:代理+线程池+Netty下面做一些解释:首先需要... 查看详情

十二.netty入门到超神系列-tcp粘包拆包处理(代码片段)

前言TCP是面向连接的,服务端和客户端通过socket进行数据传输,发送端为了更有效的发送数据,通常会使用Nagle算法把多个数据块合并成一个大的数据块,这样做虽然提高了效率,但是接收端就很难识别完整的... 查看详情

netty入门系列--使用netty进行编解码的操作(代码片段)

前言何为编解码,通俗的来说,我们需要将一串文本信息从A发送到B并且将这段文本进行加工处理,如:A将信息文本信息编码为2进制信息进行传输。B接受到的消息是一串2进制信息,需要将其解码为文本信息才能正常进行处理。... 查看详情

bionioaio及java中nio与netty的iocp区别联系

1有人能说清楚JAVA7NIONETTYIOCP之间的联系吗? 原文链接:https://www.zhihu.com/question/20853629不过这似乎是3年前的问题?还没有找到答案吗?那我说一下吧iocp和poll/epoll这些是操作系统层面的东西iocp是win,poll(linux和u... 查看详情

☀️福利向:⚡️万字图文⚡️带你vagrant从入门到超神!❤️(代码片段)

Vagrant从入门到超神🌲前言🌲🌻Vagrant简介🌻❤️入门玩法:Vagrant安装❤️⚡️初阶玩法:Vagrant常用命令⚡️1️⃣Vagrant基础命令2️⃣VagrantBox管理3️⃣Vagrant虚拟机系统命令4️⃣Vagrant插件管理🌀进... 查看详情

肝了一夜,一文说清bionioaio不同io模型演进之路(代码片段)

引言Netty作为高性能的网络通信框架,它是IO模型演变过程中的产物。Netty以JavaNIO为基础,是一种基于异步事件驱动的网络通信应用框架,Netty用以快速开发高性能、高可靠的网络服务器和客户端程序,很多开源框... 查看详情

详解java中的bionioaio(代码片段)

本文收录于JavaStarter,里面有我完整的Java系列文章,学习或面试都可以看看(一)引言IO流是Java中比较难理解的一个知识点,但是IO流在实际的开发场景中经常会使用到,比如Dubbo底层就是NIO进行通讯。本... 查看详情

netty从成神到升仙系列三netty凭什么成为国内最流行的网络通信框架?(代码片段)

...4d5;系列专栏:Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka 查看详情