IO基础
I/O基础教程,在 Linux 系统中,Linux 怎么对文件进行有效的管理呢?文件描述符 file descriptor(fd,文件描述符)就应运而生了。他是用来标识文件的概念或者术语。它是一个非负整数。
非阻塞I/O
非阻塞I/O教程,阻塞 I/O 是发起请求的时候,不会停止,会一直等待,直到获取到结果,而非阻塞 I/O 呢?它和阻塞 I/O 不同,它发起请求后会立刻返回,通过不停的轮询获取到结果。
多路复用IO
多路复用I/O教程,多路复用 I/O 的原理和 Linux 里面的 select/epoll 原理类似。它将多个进程的 I/O 注册到 Selector 选择器上面,通过 Selector 对 I/O 数据准备情况的监听来通知客户端从内核获取数据。
java IO 演进
Java的I/O演进教程,在 JDK 1.4 之前,基于 Java 的所有 Socket 通信都采用了同步阻塞的模式,也就是我们所说的 BIO 模式。这种模式不适合并发量比较大的应用。在 JDK 1.4 版本以及之后的版本中 JDK 提供了新的 NIO 类库,它可以支持 非阻塞 I/O 了。
Java的BIO
Java的BIO教程,BIO 全称 Blocking IO,底层使用的是阻塞 IO 模型,它是面向流的。每次从流中读取一个或多个字节,直至读取所有字节,操作数据的时候,不能前后移动流中数据。
Java的BIO案例
Java的BIO案例教程,上一节我们对 Java 的 BIO 编程进行了理论上的讲解,我们知道了 Java BIO 就是一请求一处理。它需要有客户端和服务端。网络通信,我们就用到了 Socket。
Java NIO
Java的NIO教程,NIO 官方名称叫做 New IO,在 JDK 1.4 中相对于 BIO 的新 IO。但是也有很多人称之为 NON-BLOCKING IO。和 BIO 比较的话,叫做非阻塞 IO。底层使用的是 IO 复用模型(同步非阻塞)。
Java AIO
Java的AIO教程,AIO 全程 Asynchronous I/O,它是异步的,客户端发起请求之后不需要等待服务端响应可以做其他的事情,然后服务端业务逻辑处理完之后会将处理结果通知客户端。
Nio 选择器
NIO选择器教程,NIO 中的 Selector 是注册各种 I/O 事件的地方,比如注册连接事件,读数据事件,写数据事件等等。NIO 的异步就是靠 Selector 告诉我们发生了什么事件。
NIO的Channel
NIO的Channel教程,Channel 就是通道的意思,它就是一个对象,通过它可以读取和写入数据。将数据从缓冲区的一侧传递到另一侧实体,比如文件或者套接字。反方向也是可以的。
初识netty
初识netty教程,我们的文章明明是介绍 Netty 的,为什么前面花了很大的篇幅去介绍 NIO 呢?因为 Netty 是一个 Java 的开源框架,它的底层内部核心就是 NIO。
Netty对Reactor支持
Netty对Reactor支持教程,我们在上一篇文章中了解到,Netty 是对 NIO 模型的支持。讲到 NIO 模型,那么我们就必须要了解一下 Reactor 模式。
Netty常用解码器
在使用 NIO 进行网络编程的时候,往往需要将读取到的字节数组或者字节缓冲区解码为业务可以使用的 POJO 对象。在 Netty 中就提供了一个抽象的解码工具类 ByteToMessageDecoder
FixedLengthFrameDecoder
FixedLengthFramDecoder 是固定长度解码器,它能够按照指定的长度对消息进行自动解码,开发者不需要考虑 TCP 的粘包和拆包等问题,非常实用。
FixedLengthFrameDecoder案例
上一章,我们了解了 FixedLengthFrameDecoder 理论知识,它在 Netty 中是一个固定长度解码器,有着很重要的作用。用户可以在服务端和客户端设置自定义的长度。该解码器就会以该长度定长解码
LineBasedFrameDecoder
LineBasedFrameDecoder 是回车换行解码器,它会找接收到的消息里面是否有 `\r\n` 。如果有就认为这个标识之前的数据就是一段数据。
LineBasedFrameDecoder案例
上一章,我们了解了 LineBasedFrameDecoder 理论知识,它在 Netty 中是回车换行解码器,有着很重要的作用。它会找接收到的消息里面是否有 `\r\n` 。如果有就认为这个标识之前的数据就是一段数据
DelimiterBasedFrameDecoder
DelimiterBasedFrameDecoder 意为分隔符解码器。它是按照指定分割符进行解码的解码器,通过分隔符可以将二进制流拆分成完整的数据包。回车换行解码器实际上是一种特殊的 DelimiterBasedFrameDecoder 解码器。
DelimiterBasedFrameDecoder案例
上一章,我们了解了 DelimiterBasedFrameDecoder 理论知识,它在 Netty 中是一个特殊字符码解码器,有着很重要的作用。它会找接收到的消息里面是否有自定义的特殊字符 。如果有就认为这个标识之前的数据就是一段数据。
MessagePack编解码
MessagePack 是一个类似于 JSON,但是比 JSON 更快,更小的高效的二进制序列化框架。我们都知道 JSON 是跨语言的,所以 MessagePack 也是支持跨语言的高效的序列化框架。
Netty的ByteBuf基本结构
前面的章节中,我们了解到了 NIO 中的 Buffer。它其实就是一个数组,然后封装了一些方法来对这个数组进行操作。其实对于 NIO 编程而言,JDK NIO 中的 Buffer 已经可以满足编程的需要了,但是对该 Buffer 操作比较复杂,它的容量不能够动态的扩展和收缩。
Netty的ByteBuf重要API
Netty 自己定义 ByteBuf 是因为 Nio 自带的 ByteBuffer 不是很好用,提供的 API 不是很完善,所以 Netty 就自定义了 ByteBuf。当然它会提供一些很好用的 API 供用户使用,来很方便的让用户对其进行操作。
AbstractReferenceCountedByteBuf源码解析
从前面的类继承关系上面我们知道,它是继承 AbstractByteBuf 的类。它的主要功能是计数,类似于 JVM 内存回收的对象引用计数器,用于跟踪对象的分配和销毁,做自动内存回收使用。
UnpooledHeapByte源码解析
UnpooledHeapByteBuf 是基于堆内存进行内存分配的字节缓冲区,它没有基于对象池技术实现。在每次 I/O 的读写都会创建一个新的 UnpooledHeapByteBuf
Netty的Channel
在了解 NIO 的 Channel 的时候,我们知道,它是用于非阻塞 I/O 的操作。类似于 NIO 的 Channel,Netty 提供了自己的 Channel 和其子类实现,用于异步 I/O 操作和其他相关的操作
Netty的AbstractNioChannel源码解析
从前面章节的类关系图上面我们可以了解到 AbstractNioChannel 继承 AbstractChannel。AbstractChannel 里面的变量 AbstractNioChannel 都拥有,并且它会实现部分 AbstractChannel 的抽象方法
Netty的AbstractNioByteChannel源码解析
AbstractNioByteChannel 是 AbstractNioChannel 的子类,它的大部分功能和 AbstractNioChannel 类似,只不过单独的实现了部分功能。
Netty的NioServerSocketChannel源码解析
NioServerSocketChannel 它是服务端连接请求 Channel。它的功能和 JDK 里面的 ServerSocketChannel 相似。
Netty的UnSafe
Unsafe 和名字一样,是不安全的,它是聚合在 Channel 中协助进行网络读写相关操作的,只能给 Channel 内部使用,不应该被 Netty 的上层使用者使用,所以定义为 Unsafe
Netty的ChannelPipeline和ChannelHndler
Netty 的 ChannelPipeline 我们可以简单的理解为一个 Channel 数据管道,消息在 ChannelPipeline 中流动和传递。ChannelPipeline 持有 I/O 事件的连接器 ChannelHandler 的链表
Netty的EventLoop和EventLoopGroup
在前面的章节中,我们了解了 Reactor 模型的特点,以及大体讲了一下,Netty 对 Reactor 模型的支持,Netty 推荐使用主从多线程模型,有一个专门的线程用来接收 TCP 连接,
Netty的Future和Promise
Future 是 Java 的原生的 API 中提供的接口,用来记录异步执行状态,Future 的 get() 方法会判断任务是否执行完成,如果完成就会立刻返回执行结果,如果没有完成则一直阻塞,