BIO,NIO模型

BIO代码实现

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class BIOServer {public static void main(String[] args) throws IOException{ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();ServerSocket serverSocket = new ServerSocket(8888);System.out.println("服务器启动...");while(true){// 监听final Socket socket = serverSocket.accept();System.out.println("连接一个客户端...");newCachedThreadPool.execute(new Runnable(){@Overridepublic void run() {handler(socket);}});}}public static void handler(Socket socket){try {byte[] bytes = new byte[1024];InputStream ins = socket.getInputStream();while(true){int readLength = ins.read(bytes);if(-1 != readLength){System.out.println("线程: " + Thread.currentThread().getName() + " ");System.out.println(new String(bytes,0,readLength));}else{break;}}} catch (Exception e) {e.printStackTrace();}finally{try {socket.close();} catch (IOException e) {e.printStackTrace();}}}
}

使用telnet连接ServerSocket

telnet 127.0.0.1 8888

NIO(non-blocking IO)同步非阻塞

NIO有三大核心部分, Channel(通道), Buffer(缓冲区), Selector(选择器)
1.每个Channel都会对应一个Buffer。
2.Selector对应一个线程,一个线程对应多个channel。
3.程序切换到哪个channel是由事件决定的,Event(事件)就是一个重要的概念。
4.Buffer是一个内存块,底层是有一个数组。
5.数据的读取写入是通过Buffer,这个和BIO不一样, BIO中是通过输入流,输出流两个流进行读取,写入的。而NIO仅仅只通过Buffer就完成读取写入。
6.Channel也是双向的,可以返回底层操作系统的情况,比如linux底层的操作系统通道就是双向的。

buffer

Channel(通道)

  1. 通道可以同时进行读写,但流只能读或者写
  2. 通道可以实现异步读写数据
  3. 通道可以从缓冲(buffer)读数据,也可以写数据到缓冲(buffer)
    FileChannel用于文件的数据读写。
    DatagramChannel用于UDP的数据读写。
    ServerSocketChannel和SocketChannel用于TCP的数据读写。

向本地文件写数据

import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;public class NIOFileChannel01 {public static void main(String[] args) throws Exception{String str = "hello, 风云争霸ddd";// 创建一个输出流FileOutputStream fos = new FileOutputStream("C:\\Users\\haha\\Desktop\\2.txt");// 通过FileOutputStream 获取对应的 FileChannel// 这个fileChannel的真是类型是FileChannelImplFileChannel fileChannel = fos.getChannel();// 创建一个缓冲区 ByteBufferByteBuffer bf = ByteBuffer.allocate(1024);// 将str放入bf中bf.put(str.getBytes());bf.flip();// 将bf数据写入到fileChannelfileChannel.write(bf);fos.close();}
}

从本地文件读数据

import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;public class NIOFileChannel02 {public static void main(String[] args) throws Exception{        // 创建一个输出流FileInputStream fis = new FileInputStream("C:\\Users\\haha\\Desktop\\2.txt");// 通过FileOutputStream 获取对应的 FileChannel// 这个fileChannel的真是类型是FileChannelImplFileChannel fileChannel = fis.getChannel();// 创建一个缓冲区 ByteBufferByteBuffer bf = ByteBuffer.allocate(1024);// 将str放入bf中fileChannel.read(bf);System.out.println(new String(bf.array()));fis.close();}
}

Buffer类相关方法

ByteBuffer类(最常用的Buffer类)

NIO还支持通过多个Buffer(即Buffer数组)完成读写操作, 即Scattering 和 Gathering

import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;/** Scattering: 将数据写入到buffer时,可以采用buffer数组,依次写入* Gathering:  从buffer读取数据时,可以采用buffer数组,依次读*/
public class ScatteringAndGatheringTest {public static void main(String[] args) throws Exception{// 使用ServerSocketChannel,ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();InetSocketAddress inetSocketAddress = new InetSocketAddress(7000);// 绑定端口到socket,并启动serverSocketChannel.socket().bind(inetSocketAddress);// 创建buffer数组ByteBuffer[] byteBuffers = new ByteBuffer[2];byteBuffers[0] = ByteBuffer.allocate(5);byteBuffers[1] = ByteBuffer.allocate(3);// 等待客户端连接SocketChannel socketChannel = serverSocketChannel.accept();int messageLength = 8;// 循环的读取while(true){int byteRead = 0;while(byteRead < messageLength){long l = socketChannel.read(byteBuffers);byteRead += l; // 累计读取的字节数System.out.println("byteRead=" + byteRead);// 看看当前buffer的position,limitfor(int i=0; i<byteBuffers.length; i++){System.out.println("position="+byteBuffers[i].position()+"  "+"limit="+byteBuffers[i].limit());}}// 将所有buffer进行flipfor(int i=0; i<byteBuffers.length; i++){byteBuffers[i].flip();}// 将数据显示到客户端long byteWrite = 0;while(byteWrite < messageLength){long l = socketChannel.write(byteBuffers);byteWrite += l;}// 将所有buffer进行clearfor(int i=0; i<byteBuffers.length; i++){byteBuffers[i].clear();}System.out.println("byteRead="+byteRead+"  byteWrite="+byteWrite);}}
}

netty:IO模型相关推荐

  1. netty发送数据_【Netty】JAVA IO模型

    为什么要学Netty? 其实我们每学一样东西,就要了解学这个的必要性.那么为什么要学Netty呢. 其实但凡涉及网络通信就必然离不开网络编程.Netty目前作为JAVA网络编程最热门的框架,毫不夸张的 ...

  2. 【Netty】Netty 简介 ( 原生 NIO 弊端 | Netty 框架 | Netty 版本 | 线程模型 | 线程 阻塞 IO 模型 | Reactor 模式引入 )

    文章目录 一. NIO 原生 API 弊端 二. Netty 简介 三. Netty 架构 四. Netty 版本 五. Netty 线程模型 六. 阻塞 IO 线程模型 七. 反应器 ( React ...

  3. 【Netty】IO 模型简介 ( Netty 特点 | Netty 应用场景 | Java 三种 IO 模型 | BIO 模型 )

    文章目录 I . Netty 简介 II . Netty 应用场景 III . Java I/O 模型 IV . BIO 概念 V . BIO 开发流程 VI . BIO 实例 VII . BIO 模 ...

  4. (二)Netty之IO模型

    IO模型 I/O模型的简单理解: 就是用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能 JAVA共支持三种网络编程模型IO模式:BIO.NIO.AIO JAVA BIO:同步并阻塞( ...

  5. IO模型及Netty线程模型

    Netty简介 1. 简介 版本:Netty4.X Netty是基于NIO的异步网络通信框架 能快速的搭建高性能易扩展的网络应用程序(服务器/客户端) 2. 特征 设计 适用于各种传输类型的统一API ...

  6. 1.聊聊Netty那些事儿之从内核角度看IO模型

    从今天开始我们来聊聊Netty的那些事儿,我们都知道Netty是一个高性能异步事件驱动的网络框架. 它的设计异常优雅简洁,扩展性高,稳定性强.拥有非常详细完整的用户文档. 同时内置了很多非常有用的模块 ...

  7. 聊聊Netty那些事儿之从内核角度看IO模型

    从今天开始我们来聊聊Netty的那些事儿,我们都知道Netty是一个高性能异步事件驱动的网络框架. 它的设计异常优雅简洁,扩展性高,稳定性强.拥有非常详细完整的用户文档. 同时内置了很多非常有用的模块 ...

  8. Netty之四种常用 IO 模型

    四种常用 IO 模型: 同步阻塞 BIO: 最简单的 IO 模型,用户线程在读写时被阻塞. 数据拷贝指请求到的数据先存放在内核空间, 然后从内核空间拷贝至程序的缓冲区. 用户线程在 IO 过程中被阻塞 ...

  9. Netty框架-IO模型(Linux五大网络IO模型)

    一. IO读写的基础原理:read.write 1.编程模型一致性以及底层系统调用的理解(缓冲区与直接调用): 1.1.无论是Socket的读写还是文件的读写,在Java层面的应用开发或者是linux ...

最新文章

  1. Linux下代码运行不了?看这里设置环境变量
  2. 点滴积累【C#】---初始页面自动给站点名称赋值
  3. notepad php必用功能,Notepad中值得一提的特性
  4. 【原创视频】docker pull和docker run运行原理分析
  5. Web Hacking 101 中文版 六、HTTP 参数污染
  6. vivo X50系列外观公布:两个版本的区别在这儿
  7. unity商店demo学习:俯视视角RPG游戏
  8. 制定科学学习计划的重要性
  9. android虚拟机工作模式,android虚拟机也能用命令行模式
  10. 【Day42 文献精读】A Bayesian Model of Perceived Head-Centered Velocity during Smooth Pursuit Eye Movement
  11. 2022最新u盘升级重装win10方法
  12. 虚拟机介绍与使用(VMware Workstation)
  13. opencv安装教程python anaconda_anaconda安装opencv(python)
  14. 【Unity3D】协同程序
  15. 文件处理命令-文件处理命令
  16. JsonFormat使用经历
  17. VMware配置VMnet8网络
  18. 2022登高架设考试题及模拟考试
  19. vue技术分享ppt_胡中南:Web端GIS技术新进展 | GTC专题论坛报告(视频+PPT+速记)
  20. 为什么软件测试工程师跳槽,越跳越值钱。嘎嘎涨薪

热门文章

  1. BZOJ 1977: [BeiJing2010组队]次小生成树(Kruskal+树上倍增)
  2. 关于移动端 触摸事件导致子元素不能绑定事件
  3. Moocryption
  4. SharePoint 2013安装图文教程
  5. Vim as Python IDE on windows(转)
  6. K:hash(哈希)碰撞攻击
  7. C#正则表达式编程(三):Match类和Group类用法
  8. 实战操作主机角色转移,Active Directory系列之十
  9. 内存与存储之边界迎来变革
  10. sublime text 心得