一,先说java IO

1,线程阻塞:当线程调用write()或read()时,线程会被阻塞,直到有一些数据可用于读取或数据被完全写入。

2,面向流: 我们需要从流中读取一个或多个字节。它使用流来在数据源/槽和java程序之间传输数据。从源进入 Java对象成为“input” , 从Java 对象 写出称为“ouput” .

二,同步非阻塞IO:当内核数据没有准备好的情况下,并不会一直阻塞等待,而是立即返回。随后多次发起系统调用,轮询过程。

优点: 不会等待阻塞,失败立即返回。

缺点: 多次发起调用,轮询过程消耗资源。

三,多路复用IO:select/epoll系统调用,单个线程不断的轮询select/epoll系统调用所负责的成百上千的socket连接,当某个或者某些socket网络连接有数据到达了,就返回这些可           以读写的连接。 在 Linux 下,实现高并发网络编程时都是以 IO 复用模型模式为主。这是同步非阻塞的升级。

优点:之前是一个线程对应一个连接。现在是一个线程对应多个连接。  适合高并发场景;系统不必创建线程,也不必维护这些线程,从而大大减小了系统的开销。

缺点:需要不断的进行select/epoll轮询,查找出可以进行IO操作的连接;select/epoll系统调用,属于同步IO,也是阻塞IO。也就是说这个读写过程是阻塞的。

二,java NIO 原理

就是多路复用原理。

三 , NIO 简单例子

package org.example;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set; public class NIOServer { public static void main(String[] args) throws IOException { Selector selector = Selector.open(); // 开启选择器
ServerSocketChannel SocketChannel = ServerSocketChannel.open();
InetSocketAddress addr = new InetSocketAddress("localhost", 1111);
SocketChannel.bind(addr); //服务器端建立channel ,绑定到端口
SocketChannel.configureBlocking(false); // 配置channel阻塞模式
int ops = SocketChannel.validOps();
SelectionKey selectKy = SocketChannel.register(selector, ops, null);
// 无限循环,保持服务器运行
while (true) {
log("我是服务器,我在等待连接... ");
selector.select(); // 从很多key中选择 已IO准备好的channel
Set<SelectionKey> Keys = selector.selectedKeys(); //从选择器中选择“已准备好的通道(对应的key)”
Iterator<SelectionKey> Iterator = Keys.iterator();
while (Iterator.hasNext()) {
SelectionKey myKey = Iterator.next();
//测试通道是否可以接收socket 连接
if (myKey.isAcceptable()) {
SocketChannel socketChannel = SocketChannel.accept();
// 修改通道阻塞模式
socketChannel.configureBlocking(false);
// 为读操作进行配置
socketChannel.register(selector, SelectionKey.OP_READ);
log("成功连接到: " + socketChannel.getLocalAddress() + "\n");
// 测试通道是否可以读
} else if (myKey.isReadable()) {
SocketChannel socketChannel = (SocketChannel) myKey.channel();
ByteBuffer Buffer = ByteBuffer.allocate(256);
socketChannel.read(Buffer);
String result = new String(Buffer.array()).trim();
log("接收到消息: " + result);
if (result.equals(".com")) {
socketChannel.close();
log("\n接收到最后一个companie name,可以关闭连接 ''");
log("\n服务器保持运行,可以继续重启客户端建立新连接进行测试。 ");
}
}
Iterator.remove();
}
}
} private static void log(String str) {
System.out.println(str);
}
} public class NIOClient {
public static void main(String[] args) throws IOException, InterruptedException { InetSocketAddress addr = new InetSocketAddress("localhost", 1111); // 建立数据报通道,并绑定地址
SocketChannel socketChannel = SocketChannel.open(addr); //channel 绑定到端口。 log("连接到服务器,端口1111...");
ArrayList<String> companyDetails = new ArrayList<String>(); //构造传输的数据 companyDetails.add("Facebook");
companyDetails.add("Twitter");
companyDetails.add("IBM");
companyDetails.add("Google");
companyDetails.add("alibaba.com");
companyDetails.add(".com"); for (String companyName : companyDetails) {
byte[] message = new String(companyName).getBytes();
ByteBuffer buffer = ByteBuffer.wrap(message); // 功能:定位 ,容量,
socketChannel.write(buffer); //将Buffer中的数据读入通道
log("发送消息: " + companyName);
buffer.clear();
Thread.sleep(2000);
}
socketChannel.close();
} private static void log(String str) {
System.out.println(str);
}
}

运行结果:

java NIO原理和代码实践的更多相关文章

  1. [JavaEE]Java NIO原理图文分析及代码实现

    转http://weixiaolu.iteye.com/blog/1479656 目录: 一.java NIO 和阻塞I/O的区别      1. 阻塞I/O通信模型      2. java NIO ...

  2. Java NIO原理图文分析及代码实现

    原文: http://weixiaolu.iteye.com/blog/1479656 目录: 一.java NIO 和阻塞I/O的区别      1. 阻塞I/O通信模型      2. java ...

  3. Java NIO原理 图文分析及代码实现

    Java NIO原理图文分析及代码实现 前言:  最近在分析hadoop的RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上请 ...

  4. Java NIO原理分析

    Java IO 在Client/Server模型中,Server往往需要同时处理大量来自Client的访问请求,因此Server端需采用支持高并发访问的架构.一种简单而又直接的解决方案是“one-th ...

  5. Java NIO原理和使用

    Java NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内 ...

  6. Java NIO原理和使用(转载一)

    Java NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内 ...

  7. Java NIO原理及实例

    Java NIO是在jdk1.4开始使用的,它既可以说成“新I/O”,也可以说成非阻塞式I/O.下面是java NIO的工作原理: 1. 由一个专门的线程来处理所有的 IO 事件,并负责分发. 2. ...

  8. java NIO 原理解析之学习笔记

    关键抽象 1.Buffer缓冲区 NIO数据传递模型,是一个连续的内存区域.所有数据传递均通过buffer类处理:NIO提供了字符串.整形.字节.堆等多种缓冲区. 2.Channel(通道) NIO把 ...

  9. 10分钟看懂, Java NIO 底层原理

    目录 写在前面 1.1. Java IO读写原理 1.1.1. 内核缓冲与进程缓冲区 1.1.2. java IO读写的底层流程 1.2. 四种主要的IO模型 1.3. 同步阻塞IO(Blocking ...

  10. java NIO系列教程1

    ava NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式. Java NIO: Channel ...

随机推荐

  1. 重学SpringBoot. step4 Redis的应用

    Redis的应用 Redis支持的七种数据类型:字符串.散列.列表(链表).集合.有序集合.基数和地理位置,具体用Java怎么操作其实可以直接看redisTemplate的源代码. Redis引出来的 ...

  2. mybatis学习日记3

    1.mybatis的延迟加载 问题:在一对多中,当我们有一个用户,他有100个账户 在查询用户的时候,要不要把关联的账户查出来? 在查询账户的时候,要不要把关联的用户查出来? 解决:在查询用户的时候, ...

  3. Element ui&图标、按钮、超链接、单选框

    ElementUI&Vant ui 基于Vue的一套桌面端的组件库,提前封装好的UI模版,方便开发者快速搭建一个网站前端界面. 官网:https://element.eleme.cn/#/zh ...

  4. 微信小程序分包

    当我们程序太大的时候,打开小程序就会比较慢,此处就需要用到分包加载,按照模块划分不同的包,让用户在需要的时候才加载对用的模块,也就是用户在进入某些页面的时候才下载该页面的资源,提高小程序的打开速度,以 ...

  5. Win10 局域网共享文件遇到的疑难杂症通用解决策略

    win10局域网共享文件时遇到的疑难杂症类型: 1. 网络列表中不能发现别人的计算机,别人也看不到自己的计算机 启用windows功能:SMB 1.0/CIFS 文件共享支持 确保文件共享的计算机处于 ...

  6. Postman操作指南

    基本使用 基本使用在这里不做记录,大多数人下载完就会用.这里记一下重点. 抓包浏览器 浏览器安装插件postman interceptor:插件在postman-interceptor界面最下面提示的 ...

  7. Linux CentOS 7 磁盘扩容(原有磁盘扩容,非新增磁盘)

    背景: 接上篇  https://www.cnblogs.com/si-yuan/p/17148835.html,只是展示出了磁盘大小,还需进行如下操作,去完成原有磁盘的扩容. ----------- ...

  8. 免杀之:Mimikatz 免杀过杀软,思路学习

    免杀之:Mimikatz 免杀过杀软 目录 免杀之:Mimikatz 免杀过杀软 1 环境准备 2 处理过程 2.1 生成原始的Mimikatz程序 2.2 定位到代码或字符串上特征绕过 2.3 定位 ...

  9. 代码随想录算法训练营day22 | leetcode 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点

    LeetCode 235. 二叉搜索树的最近公共祖先 分析1.0  二叉搜索树根节点元素值大小介于子树之间,所以只要找到第一个介于他俩之间的节点就行 class Solution { public T ...

  10. .Net 调用 sqlserver 存储过程实例

    1.输出datatable 存储过程: create proc inparamS @inpar varchar(20) as begin select top 1 * from Address whe ...