文章目录

  • I . 缓冲区 ( Buffer ) 分散 Scattering 与 聚合 Gathering 概念
  • II . 缓冲区 ( Buffer ) 分散 Scattering 与 聚合 Gathering 示例 ( 客户端 )
  • III . 缓冲区 ( Buffer ) 分散 Scattering 与 聚合 Gathering 示例 ( 服务器端 )

I . 缓冲区 ( Buffer ) 分散 Scattering 与 聚合 Gathering 概念


1 . 分散 Scattering 对应缓冲区写入 : 通道 ( Channel ) 向 缓冲区数组 中写出数据 , 按照索引从第 0 个缓冲区 ( Buffer ) 开始, 依次写入数据 ;

缓冲区 ( Buffer ) 分散 ( Scattering ) 对应方法 : 这是一类方法 , 有很多 , 这里只举一个例子说明 ;

public long read(ByteBuffer[] dsts) throws IOException;

2 . 聚合 Gathering 对应缓冲区读取 : 通道 ( Channel ) 从 缓冲区数组 中读取数据 , 按照索引从第 0 个缓冲区 ( Buffer ) 开始, 依次读取数据 ;

缓冲区 ( Buffer ) 聚合 ( Gathering ) 对应方法 : 这是一类方法 , 有很多 , 这里只举一个例子说明 ;

public long write(ByteBuffer[] srcs) throws IOException;

分散 Scattering 与 聚合 Gathering 都是 通道 ( Channel ) 对 缓冲区数组 ( Buffer[] ) 进行读写的操作 ;

II . 缓冲区 ( Buffer ) 分散 Scattering 与 聚合 Gathering 示例 ( 客户端 )


客户端需求 : 本节演示代码的重心在服务器端 , 服务器端演示 分散 聚合 的具体操作 , 客户端只是演示 网络套接字 流程 , 这里客户端使用 BIO , 使用 TCP 协议进行简单的数据发送 ;

package kim.hsl.bio;import java.io.IOException;
import java.net.Inet4Address;
import java.net.InetSocketAddress;
import java.net.Socket;public class TCPClient {public static void main(String[] args) {try {Socket socket = new Socket();InetSocketAddress inetSocketAddress =new InetSocketAddress(Inet4Address.getLocalHost(),   //本机IP地址8888                      //端口号);System.out.println("客户端开始连接 ...");//此处会阻塞等待连接成功socket.connect(inetSocketAddress);System.out.println("客户端连接成功");//连接成功后, 开始执行后续操作socket.getOutputStream().write("Hello World".getBytes());System.out.println("客户端写出 Hello World 成功");} catch (IOException e) {e.printStackTrace();}}
}

这是之前的示例中使用过的 , 这里在用一次 , 实现的功能 就是 连接目标 IP 地址的 8888 端口 , 发送 “Hello World” 字符串给服务器 , 之后退出 ;

III . 缓冲区 ( Buffer ) 分散 Scattering 与 聚合 Gathering 示例 ( 服务器端 )


1 . 示例需求 : 服务器端使用多个 缓冲区 ( Buffer ) 组成的数组 , 进行读写数据 , 客户端上传的数据 通过 套接字通道 ( SocketChannel ) 写出到 缓冲区数组中 , 服务器端再使用 文件通道 ( FileChannel ) 将数据写出到本地文件中 ;

2 . 示例分析 :

① 缓冲区数组 : ByteBuffer[] buffers = new ByteBuffer[2]; , 创建一个缓冲区数组 , 将这两个缓冲区数组作为读写操作的载体 , 读取数据时就涉及到了缓冲区的 聚合 操作 , 写出数据时 , 就涉及到了 分散 操作 ;

② 分散 Scattering : socketChannel.read(buffers); , 这里直接将数据读取存放到了 缓冲区数组中 , 是将数据分散放入缓冲区数组 , 涉及到 缓冲区 分散 操作 ;

③ 聚合 Gathering : fcOut.write(buffers); , 这里将两个缓冲区的数据 写出到了文件中 , 将分散的数据输入到一个文件中 , 涉及到 缓冲区 聚合 操作 ;

④ 注意缓冲区翻转操作 : 先读取数据 , 之后必须调用 flip() 方法翻转缓冲区 , 然后再写出数据 , 否则会出错 ;

3 . 示例代码 :

package kim.hsl.nio;import java.io.FileOutputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;/*** 分散 ( Scattering ) 与 聚合 ( Gathering ) 示例** 分散 ( Scattering ) : 通道 ( Channel ) 向 缓冲区数组 中写出数据,*                       按照索引从第 0 个缓冲区 ( Buffer ) 开始, 依次写入数据* 聚合 ( Gathering ) : 通道 ( Channel ) 从 缓冲区数组 中读取数据,*                      按照索引从第 0 个缓冲区 ( Buffer ) 开始, 依次读取数据** 使用 服务器套接字通道 ( ServerSocketChannel ) 和 套接字通道 ( SocketChannel ) 进行聚合演示* 使用 文件通道 ( FileChannel ) 进行分散演示** @author han**/
public class BufferDemo4 {public static void main(String[] args) {try {//1 . 创建 ServerSocketChannel, 绑定本地端口ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();InetSocketAddress inetSocketAddress = new InetSocketAddress(8888);serverSocketChannel.socket().bind(inetSocketAddress);//2 . 创建 2 个 ByteBuffer, 并放入数组中ByteBuffer[] buffers = new ByteBuffer[2];buffers[0] = ByteBuffer.allocate(4);buffers[1] = ByteBuffer.allocate(8);//3 . ServerSocketChannel 阻塞等待客户端连接, 该方法执行后一直阻塞SocketChannel socketChannel = serverSocketChannel.accept();//4 . 阻塞读取数据, 将数据读取到 buffers 缓冲区数组中的缓冲区中socketChannel.read(buffers);//5 . 将两个 缓冲区 flip 翻转一下, position 设置为 0buffers[0].flip();buffers[1].flip();//6 . 将读取到的数据写出到文件中FileOutputStream fos = null;try {//1 . FileChannel 可以从 FileOutputStream 中获取fos = new FileOutputStream("file4.txt");//2 . 创建 FileChannel , 从 FileInputStream / FileOutputStream 中可以获取到//FileChannel 是抽象类 , 实际类型是 FileChannelImplFileChannel fcOut = fos.getChannel();//3 .  将读取到的数据写出到文件中fcOut.write(buffers);} catch (IOException e) {e.printStackTrace();} finally {try {if(fos != null)fos.close();} catch (IOException e) {e.printStackTrace();}}} catch (IOException e) {e.printStackTrace();}}
}

4 . 执行 服务器端 与 客户端 程序 : 一定要按照顺序执行 , 先启动服务器端 , 再启动客户端 ;

① 启动服务器端 : 先运行服务器端 ;

② 启动客户端 : 再运行客户端 ;

客户端开始连接 ...
客户端连接成功
客户端写出 Hello World 成功

③ 查看服务器端文件写出结果 :

【Netty】NIO 缓冲区 ( Buffer ) 分散 Scattering 与 聚合 Gathering 操作相关推荐

  1. 【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )

    文章目录 I . 缓冲区 ( Buffer ) 存取类型 II . 只读缓冲区 ( ReadOnlyBuffer ) III . 映射字节缓冲区 ( MappedByteBuffer ) I . 缓冲 ...

  2. 【Netty】NIO 缓冲区 ( Buffer ) 组件

    文章目录 I . NIO 三大核心组件 对应关系 II . 缓冲区 ( Buffer ) 类 III . 缓冲区 ( Buffer ) 机制 IV . 缓冲区 ( Buffer ) 机制 示例解析 V ...

  3. JAVA NIO缓冲区(Buffer)------ByteBuffer常用方法详解

    缓冲区(Buffer) 缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储,这部分预留的内存空间就叫做缓冲区: 使用缓冲区有这么两个好处: 1.减少实际 ...

  4. java 缓冲区中的数据存入缓冲区中_java8中NIO缓冲区(Buffer)的数据存储详解|chu...

    java8新特性NIO缓冲区(Buffer)的数据存储. ByteBuffer,CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer, Dou ...

  5. 【Netty】NIO 选择器 ( Selector ) 通道 ( Channel ) 缓冲区 ( Buffer ) 网络通信案例

    文章目录 I . NIO 通信 服务器端 流程说明 II . NIO 通信 服务器端代码 III . NIO 通信 客户端 流程说明 IV . NIO 通信 客户端代码 V . NIO 通信 示例运行 ...

  6. 【Netty】NIO 简介 ( NIO 模型 | NIO 三大组件 | 选择器 Selector | 通道 Channel | 缓冲区 Buffer | NIO 组件分配 | 缓冲区示例 )

    文章目录 I . NIO 模型 II . NIO 三大组件交互流程 III . NIO 缓冲区 IV . NIO 与 BIO 对比 V . NIO 线程分配 VI . 缓冲区 ( Buffer ) 示 ...

  7. java buffer nio_Java NIO之Buffer(缓冲区)入门

    ​Java NIO中的缓存区(Buffer)用于和通道(Channel)进行交互.数据是从通道读入缓冲区,从缓冲区写入到通道中的. ​缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内 ...

  8. java堆缓冲区,Java NIO之Buffer(缓冲区)

    Java NIO主要解决了Java IO的效率问题,解决此问题的思路之一是利用硬件和操作系统直接支持的缓冲区.虚拟内存.磁盘控制器直接读写等优化IO的手段:思路之二是提供新的编程架构使得单个线程可以控 ...

  9. Java NIO学习篇之缓冲区Buffer详解

    定义 缓冲区Buffer在java nio中负责数据的存储,缓冲区就是数组,用于存储不同类型数据的数组. jdk为java七大基本类型数据都准备了响应的缓冲区(boolean值除外): ByteBuf ...

最新文章

  1. 约束布局ConstraintLayout看这一篇就够了
  2. arch linux网络配置,关于archlinux网络的 配置
  3. android ColorDrawable的使用
  4. 关于Web面试的基础知识点--Javascript(一)
  5. 解决Windows上编译PHP7.1拓展的错误
  6. python消费kafka逻辑处理导致cpu升高_爬虫架构|利用Kafka处理数据推送问题(1)
  7. java统计空间占用_如何计算Java对象占用了多少空间?
  8. 如何使用 AirDrop 将 MAC 中的照片整理好,并上传到 iPhone 的相册中?
  9. BNU10782被诅咒的代码
  10. python菜鸟教程python基础教程
  11. MySQL的 初步认识 - 细节狂魔
  12. 程序员该如何提高睡眠质量?—程序媛233酱的助攻~
  13. 前度构建工具gulp
  14. Tomcat启动项目出现 javax.el.ELException
  15. HMS Core 5,activity事件分发
  16. 在线Base64编码 = 图片
  17. cadence 怎么拼版_一种基于Cadenceskill的快速板卡拼版方法与流程
  18. vue el-select远程搜索
  19. 计算机cpu散热方式,调整电脑CPU散热风扇转速的简单方法【图文】
  20. 火狐 userchrome.css 在哪,深入瞭解 FireFox 八、userChrome.css userContent.c...

热门文章

  1. 一种结合混沌密码理论的彩色图象水印算法
  2. css hover图片hover效果兼容ie8
  3. 多用户商城系统 KgMall2.1公布
  4. 阿里大鱼.net core 发送短信
  5. 评价cnblogs.com的用户体验
  6. 关于“无法解析的外部符号”和“该符号在函数_wmain 中被引用”的问题
  7. IDispose和Finalize的区别和联系
  8. 获取其他进程中ListView的文本
  9. stm32无法进入串口接收中断
  10. jpa单向多对一关联映射