【Netty】NIO 通道 ( Channel ) 组件(一)

简介: 【Netty】NIO 通道 ( Channel ) 组件(一)

I . 通道 ( Channel ) 概念简介


NIO 模型中的 通道 ( Channel ) 组件 :



① NIO 双向读写 : NIO 中的通道 ( Channel ) 是可以双向读写的 , 而 BIO 中的 单一流 ( 输入流 / 输出流 ) 只能读或者只能写 ;


② NIO 异步读写 : NIO 中的通道 ( Channel ) 读写时是异步的 , 全程没有阻塞 ;


③ BIO 同步读写 : BIO 中的流 , 读写时都需要阻塞等待对方回应 ;


④ 通道 ( Channel ) 与 缓冲区 ( Buffer ) : 服务器中 , 通道 ( Channel ) 与 缓冲区 ( Buffer ) 一一对应 , 通道可以读取缓冲区中的数据 , 也可以写出数据到缓冲区中 , 这也是双向读写 ;






II . 通道 ( Channel ) 常用类


通道 ( Channel ) 常用类 : Channel 在 Java 语言 NIO 中被定义成接口 , 常用的实现类有如下 :



① FileChannel : 文件通道 , 用于文件的读写 ;


② ServerSocketChannel : 服务器套接字通道 , 其作用与 BIO 中的 ServerSocket 类似 . 用于 TCP 网络通信中读写数据 ;


③ SocketChannel : 套接字通道 , 其作用与 BIO 中的 Socket 类似 , 用于 TCP 网络通信中读写数据 ;


④ DatagramChannel : 数据包通道 , 用于 UDP 网络通信中读写数据 ;






III . 常用的 通道 ( Channel ) 之 套接字通道 ( SocketChannel )


常用的 通道 ( Channel ) 之 网络套接字通道 ( SocketChannel ) :



① ServerSocketChannel : 在服务器端 , 维护一个 ServerSocketChannel 通道 , 客户端请求服务器通信时 , 服务器端线程会给每个客户端创建一个为该客户端服务的 SocketChannel , 之后服务器与客户端 , 都通过该 SocketChannel 进行通信 ;



② ServerSocketChannel 和 SocketChannel 都是抽象类 :


ServerSocketChannel 是抽象类 , 其真实实现的类型为 ServerSocketChannelImpl ;

SocketChannel 是抽象类 , 其真实类型为 SocketChannelImpl ;





IV . 常用的 通道 ( Channel ) 之 文件通道 ( FileChannel )


常用的 通道 ( Channel ) 之 文件通道 ( FileChannel ) : 主要作用是 读取 , 写入 , 映射 , 操作本地文件 ;



FileChannel 常用方法 : 前两个是 FileChannel 通道与 缓冲区 读写数据 , 后两个是 FileChannel 与其它 通道 读写数据 ;


int read(ByteBuffer dst) : 从 FileChannel 通道中读取数据 , 放入 dst 字节缓冲区中 ;

int write(ByteBuffer src) : 将 src 缓冲区中的数据 , 写入到 FileChannel 通道中 ;

long transferFrom(ReadableByteChannel src, long position, long count) : 将字节数据从 src 通道传输到本 FileChannel 通道中 ;

long transferTo(long position, long count, WritableByteChannel target) : 将字节数据从本 FileChannel 通道传输到 target 通道中 ;





V . 文件通道 ( FileChannel ) 写出文件 示例代码

image.png



1 . 示例需求 : 将 “Hello World” 字符串通过 文件通道 ( FileChannel ) 写出到文件中 ;



① 文件通道 ( FileChannel ) 获取 : NIO 中 , 文件通道 ( FileChannel ) 可以从 文件输出流 ( FileOutputStream ) 中进行获取 , 其本质是通过文件输出流 , 向文件中写出数据 ;


② 整体流程 : 先将 “Hello World” 字符串写入 字节缓冲区 ( ByteBuffer ) , 在将字节缓冲区 ( ByteBuffer ) 中的数据 写出到 文件通道 ( FileChannel ) 中 , 最后通过 文件通道 ( FileChannel ) 将数据写出到文件中 ;



2 . 代码示例 :



package kim.hsl.nio;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class FileChannelDemo {
    public static void main(String[] args) {
        FileOutputStream fos = null;
        try {
            String hello = "Hello World";
            //1 . FileChannel 可以从 FileOutputStream 中获取
            fos = new FileOutputStream("file.txt");
            //2 . 创建 FileChannel , 从 FileOutputStream 中可以获取到
            //FileChannel 是抽象类 , 实际类型是 FileChannelImpl
            FileChannel fc = fos.getChannel();
            //3 . FileChannel 需要通过 缓冲区 Buffer 才能与数据进行读写交互
            ByteBuffer buffer = ByteBuffer.allocate(32);
            //将数据放入缓冲区中 , flip 方法作用是将 position 位置设置 0
            buffer.put(hello.getBytes());
            buffer.flip();
            //4 . 将 字节缓冲区 ByteBuffer 中的数据写入到 文件通道 FileChannel 中
            fc.write(buffer);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(fos != null)
                    fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}



执行结果 : 在代码的 src 目录生成 file.txt 文件 , 内容为 Hello World ;


image.png



目录
相关文章
|
5月前
|
设计模式
Lettuce的特性和内部实现问题之Netty NIO的性能优于BIO的问题如何解决
Lettuce的特性和内部实现问题之Netty NIO的性能优于BIO的问题如何解决
|
7月前
|
存储 编解码 移动开发
技术笔记:NIO流—理解Buffer、Channel概念和NIO的读写操作
技术笔记:NIO流—理解Buffer、Channel概念和NIO的读写操作
46 1
|
2月前
|
消息中间件 缓存 Java
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
零拷贝技术 Zero-Copy 是指计算机执行操作时,可以直接从源(如文件或网络套接字)将数据传输到目标缓冲区, 而不需要 CPU 先将数据从某处内存复制到另一个特定区域,从而减少上下文切换以及 CPU 的拷贝时间。
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
|
4月前
|
Java
Netty BIO/NIO/AIO介绍
Netty BIO/NIO/AIO介绍
|
5月前
|
网络协议 C# 开发者
WPF与Socket编程的完美邂逅:打造流畅网络通信体验——从客户端到服务器端,手把手教你实现基于Socket的实时数据交换
【8月更文挑战第31天】网络通信在现代应用中至关重要,Socket编程作为其实现基础,即便在主要用于桌面应用的Windows Presentation Foundation(WPF)中也发挥着重要作用。本文通过最佳实践,详细介绍如何在WPF应用中利用Socket实现网络通信,包括创建WPF项目、设计用户界面、实现Socket通信逻辑及搭建简单服务器端的全过程。具体步骤涵盖从UI设计到前后端交互的各个环节,并附有详尽示例代码,助力WPF开发者掌握这一关键技术,拓展应用程序的功能与实用性。
172 0
|
5月前
|
存储 网络协议 Java
【Netty 神奇之旅】Java NIO 基础全解析:从零开始玩转高效网络编程!
【8月更文挑战第24天】本文介绍了Java NIO,一种非阻塞I/O模型,极大提升了Java应用程序在网络通信中的性能。核心组件包括Buffer、Channel、Selector和SocketChannel。通过示例代码展示了如何使用Java NIO进行服务器与客户端通信。此外,还介绍了基于Java NIO的高性能网络框架Netty,以及如何用Netty构建TCP服务器和客户端。熟悉这些技术和概念对于开发高并发网络应用至关重要。
98 0
|
8月前
|
设计模式 前端开发 网络协议
面试官:说说Netty的核心组件?
Netty 核心组件是指 Netty 在执行过程中所涉及到的重要概念,这些核心组件共同组成了 Netty 框架,使 Netty 框架能够正常的运行。 Netty 核心组件包含以下内容: 1. 启动器 Bootstrap/ServerBootstrap 2. 事件循环器 EventLoopGroup/EventLoop 3. 通道 Channel 4. 通道处理器 ChannelHandler 5. 通道管道 ChannelPipeline 这些组件的交互流程如下: ![image.png](https://cdn.nlark.com/yuque/0/2024/png/92791/1716
58 0
面试官:说说Netty的核心组件?
|
8月前
|
Java 应用服务中间件 API
从零手写实现 tomcat-06-servlet bio/thread/nio/netty 池化处理
该文介绍了逐步改进的网络服务器实现,从最初的 BIO 基础版到使用线程池的 BIO+Thread,再到 NIO 版本和 NIO+Thread,最后展示了一个使用 Netty 框架的简洁实现。文章旨在说明如何解决阻塞问题,并对比不同模型的优劣,最终推荐使用 Netty 以简化 NIO 编程。
|
8月前
|
编解码 网络协议 Java
用Java的BIO和NIO、Netty实现HTTP服务器(一) BIO与绪论
用Java的BIO和NIO、Netty实现HTTP服务器(一) BIO与绪论
|
8月前
|
移动开发 编解码 网络协议
用Java的BIO和NIO、Netty来实现HTTP服务器(三) 用Netty实现
用Java的BIO和NIO、Netty来实现HTTP服务器(三) 用Netty实现