IO模型
horseber
飞是小李飞刀的飞,刀是小李飞刀的刀
展开
-
netty心跳检测
为什么需要心跳在TCP长连接的过程中,若发生网络抖动等原因,导致连接中断。恰好服务器和客户端之间在这个 时间点没有数据交互。则不能在短时间内发现对方掉线。心跳检测的原理:在客服端和服务器之间没有数据交互处于idle状态时,客服端或者服务器向对方发送一种特殊的数据包 ,对方收到数据包之后也回一个特定的数据包。形成一个ping-pong交互。当某方掉线时,可以及时确认TCP的连接有效性实现心跳的两种方式1、使用TCP协议层面keeplive机制【注意区分Http的header中的keep-a原创 2020-07-27 19:13:56 · 566 阅读 · 0 评论 -
Netty处理半包粘包问题
无论是服务端还是客户端,当我们读取或者发送消息的时候,都需要考虑TCP底层的粘包/拆包机制。TCP粘包/拆包发生的根本原因【流式协议,消息无边界】粘包主要原因发送方每次写入数据 < 套接字缓冲区大小 接收方读取套接字缓冲区数据不够及时半包的主要原因:发送方写入数据 > 套接字缓冲区大小 发送的数据大于协议的 MTU(Maximum Transmission Unit,最大传输单元),必须拆包拆包、粘包示例假设客户端分别发送了两个数据包D1和D2给服务端,由于服务端一次原创 2020-07-27 19:10:29 · 388 阅读 · 0 评论 -
IO模型-NIO选择器
为了将Channel和Selector配合使用,channel必须注册到selector上。通过SelectableChannel.register()方法来实现.Channel必须处于非阻塞模式下。这意味着不能将FileChannel与Selector一起使用,因为FileChannel不能切换到非阻塞模式。而套接字通道都可以基于选择器,Java 的 NIO,用非阻塞的 IO 方式。可以用一个线程,处理多个的客户端连接,避免了多线程之间的上下文切换导致的开销SelectionKey key =原创 2020-07-27 19:02:42 · 193 阅读 · 0 评论 -
IO模型-NIO管道
通道(Channel)所有的 IO 在NIO 中都从一个Channel开始,数据可以从Channel读到Buffer中,也可以从Buffer写到Channel中channel必须注册到selectorChannel与流的区别:BIO 中的 stream 是单向的,例如 FileInputStream 对象只能进行读取数据的操作,而 NIO 中的通道(Channel)是双向的,可以读操作,也可以写操作。 通道可以异步地读写。 通道中的数据总是要先读到一个Buffer,或者总是要从一个...原创 2020-07-27 18:52:17 · 161 阅读 · 0 评论 -
IO模型-NIO缓冲区
缓冲区(Buffer):缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存(底层是数组)。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。理解Buffer的工作原理,需要熟悉它的三个属性:capacity容量,即可以容纳的最大数据量;在缓冲区创建时被设定并且不能改变.设定后只能往里写capacity个byte、long,char等类型。一旦Buffer满了,需要将其清空(通过读数据或者清除数据)才能继续写数据往里写数据。position表示原创 2020-07-27 18:48:53 · 128 阅读 · 0 评论 -
IO模型-NIO
传统BIO同步阻塞:阻塞节点1:等待客户端的连接阻塞节点2:客户端连接请求进来后,需要创建独立的线程处理,且当前线程暂时没有数据可读,则线程就阻塞在 Read 操作上NIO 基于 Channel(通道)和 Buffer(缓冲区)进行操作,数据先总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择器)用于监听多个通道的事件(比如:连接请求,数据到达等),因此使用单个线程就可以监听多个客户端通道 。Selector 、 Channel 和 Buffer 的关系:一个Se原创 2020-07-27 18:45:13 · 122 阅读 · 0 评论 -
IO模型
Unix网络编程的五种IO模型:阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO。操作系统的IO模型是底层基石,Java有三种IO模型的基础:NIO、NIO、AIO就是对于IO的操作其实就是进一步的封装。Java的三种IO模型,BIO就是操作系统提供的阻塞IO模型,NIO是IO复用模型,而AIO是异步IO模型相关概念不管是网络IO还是磁盘IO,对于读操作而言,都是等到网络的某个数据分组到达后/数据准备好后,将数据拷贝到内核空间的缓冲区中,再从内核空间拷贝到用户空间的缓冲区。(原创 2020-07-27 18:34:57 · 166 阅读 · 0 评论