JDK NIO编程】的更多相关文章

我们首先需要澄清一个概念:NIO到底是什么的简称?有人称之为New I/O,因为它相对于之前的I/O类库是新增的,所以被称为New I/O,这是它的官方叫法.但是,由于之前老的I/O类库是阻塞I/O,New I/O类库的目标就是要让Java支持非阻塞I/O,所以,更多的人喜欢称之为非阻塞I/O(Non-block I/O),由于非阻塞I/O更能够体现NIO的特点. 与Socket类和ServerSocket类相对应,NIO也提供了SocketChannel和ServerSocketChannel…
目录: Reactor(反应堆)和Proactor(前摄器) <I/O模型之三:两种高性能 I/O 设计模式 Reactor 和 Proactor> <[转]第8章 前摄器(Proactor):用于为异步事件多路分离和分派处理器的对象行为模式> <Java NIO系列教程(八)JDK AIO编程>-- java AIO的proactor模式 <Java NIO系列教程(七) selector原理 Epoll版的Selector>--java NIO的Reac…
NIO2.0引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现.异步通道提供两种方式获取获取操作结果. 通过java.util.concurrent.Future类来表示异步操作的结果: 在执行异步操作的时候传入一个java.nio.channels. CompletionHandler接口的实现类作为操作完成的回调. NIO2.0的异步套接字通道是真正的异步非阻塞I/O,它对应UNIX网络编程中的事件驱动I/O(AIO),它不需要通过多路复用器(Selector)对注册的通道…
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7793964.html 前面讲到:Java IO编程全解(三)——伪异步IO编程 NIO,即New I/O,这是官方叫法,因为它相对于之前的I/O类库是新增的.但是,由于之前老的I/O类库是阻塞I/O,New I/O类库的目标就是要让Java支持非阻塞I/O,所以,更多的人喜欢称之为非阻塞I/O(Non-block I/O),由于非阻塞I/O更能够体现NIO的特点,所以这里使用的NIO都是指非阻塞I/O.…
IO(BIO)和NIO的区别:其本质就是阻塞和非阻塞的区别. 阻塞概念:应用程序在获取网络数据的时候,如果网络传输数据很慢,那么程序就一直等着,直到传输完毕为止. 非阻塞概念:应用程序直接可以获取已经准备就许好的数据,无需等待. IO为同步阻塞形式,NIO为同步非阻塞形式.NIO并没有实现异步,在JDK1.7只后,升级了NIO库包,支持异步非阻塞通信模型即NIO2.0(AIO) 同步和异步:同步和异步一般是面向操作系统与应用程序对IO操作的层面上来区别的. 同步时,应用程序会直接参与IO读写操作…
前言 学习Netty编程,避免不了从了解Java 的NIO编程开始,这样才能通过比较让我们对Netty有更深的了解,才能知道Netty大大的好处.传统的NIO编程code起来比较麻烦,甚至有遗留Bug,但其中最基本的思想是一致的. 参考资料<Netty In Action>.<Netty权威指南>(有需要的小伙伴可以评论或者私信我) 博文中所有的代码都已上传到Github,欢迎Star.Fork 一.NIO 核心组件 NIO,有人称之为New I/O,这是官方叫法.但是由于之前老的…
让我们来到微观世界重新认识 Netty 在前面 Netty 源码解析系列 <聊聊 Netty 那些事儿>中,笔者带领大家从宏观世界详细剖析了 Netty 的整个运转流程.从一个网络数据包在内核中的收发过程开始聊起,总体介绍了 Netty 的 IO 线程模型,后面我们围绕着这个 IO 模型又详细介绍了整个 Reactor 模型在 Netty 中的实现. 这个宏观流程包括:Reactor模型的创建,启动,运转架构,网络连接的接收和关闭,网络数据的接收和发送,利用 pipeline 对 IO 处理逻…
高性能编程在对不同场景下对于容器的选择有着非常苛刻的条件,这里记录下前人总结的经验,并对源码进行调试 JDK高性能编程之容器 读书笔记内容部分来源书籍深入理解JVM.互联网等 先放一个类图util,点击打开看明细 j360-jdk调试功能 https://github.com/xuminwlt/j360-jdk 内容 容器 -Collection List  ArrayList  LinkedList  Vector   Stack Set  HashSet Queue -Map  HashMa…
Doug Lea 在 Scalable IO in Java 的 PPT 中描述了 Reactor 编程模型的思想,大部分 NIO 框架和一些中间件的 NIO 编程都与它一样或是它的变体.本文结合 PPT 按照自己的理解整理而来,最终编写了一个简单的 NIO 回显服务. Reactor 之所以高效是因为采用了分而治之和事件驱动的设计.大部分网络服务像 Web 服务器.分布式对象的通信等大多数具有相同的基本处理流程: 读取请求数据 - read 按协议解析请求 - decode 业务处理 - pr…
NIO概述 什么是NIO? Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式. Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中. Java NIO: Non-blocking IO(非阻塞…
终于,这两天的考试熬过去了, 兴致冲冲的来整理笔记来, 这篇博客是我近几天的NIO印象笔记汇总,记录了对Selector及Selector的重要参数的理解,对Channel的理解,常见的Channel,对NIO事件驱动的编程模型的理解,NIO与传统IO的对比,NIO的TCP/IP编程的实践. Channel 什么是Channel 这个概念绝对是一级概念,Channel是一个管道,用于连接字节缓冲区和另一端的实体, 这个字节缓冲区就是ByteBuffer, 另一端的实体可以是一个File 或者是…
NIO 编程模型 Doug Lea 在 Scalable IO in Java 的 PPT 中描述了 Reactor 编程模型的思想,大部分 NIO 框架和一些中间件的 NIO 编程都与它一样或是它的变体.本文结合 PPT 按照自己的理解整理而来,最终编写了一个简单的 NIO 回显服务. Reactor 之所以高效是因为采用了分而治之和事件驱动的设计.大部分网络服务像 Web 服务器.分布式对象的通信等大多数具有相同的基本处理流程: 读取请求数据 - read 按协议解析请求 - decode…
第一章:手动搭建I/O网络通信框架1:Socket和ServerSocket入门实战,实现单聊 第二章:手动搭建I/O网络通信框架2:BIO编程模型实现群聊 在第二章中用BIO编程模型,简单的实现了一个聊天室.但是其最大的问题在解释BIO时就已经说了:ServerSocket接收请求时(accept()方法).InputStream.OutputStream(输入输出流的读和写)都是阻塞的.还有一个问题就是线程池,线程多了,服务器性能耗不起.线程少了,在聊天室这种场景下,让用户等待连接肯定不可取…
1. 前言 笔者在 <从 Linux 内核角度看 IO 模型的演变>一文中曾对 Socket 文件在内核中的相关数据结构为大家做了详尽的阐述. 又在此基础之上介绍了针对 socket 文件的相关操作及其对应在内核中的处理流程: 并与 epoll 的工作机制进行了串联: 通过这些内容的串联介绍,我想大家现在一定对 socket 文件非常熟悉了,在我们利用 socket 文件接口在与内核进行网络数据读取,发送的相关交互的时候,不可避免的涉及到一个新的问题,就是我们如何在用户空间设计一个字节缓冲区来…
什么是NIO? NIO 库是在 JDK 1.4 中引入的.NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的.面向块的 I/O.NIO翻译成 no-blocking io 或者 new io都说得通. 和BIO的主要区别 面向流与面向缓冲 Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的. Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方.此外,它不能前后移动流中的数据.如果需要前后移动从…
“反应”器名字中”反应“的由来: “反应”即“倒置”,“控制逆转”,具体事件处理程序不调用反应器,而向反应器注册一个事件处理器,表示自己对某些事件感兴趣,有时间来了,具体事件处理程序通过事件处理器对某个指定的事件发生做出反应:这种控制逆转又称为“好莱坞法则”(不要调用我,让我来调用你) 例如,路人甲去做男士SPA,前台的接待小姐接待了路人甲,路人甲现在只对10000技师感兴趣,就告诉接待小姐,等10000技师上班了或者是空闲了,通知我.等路人甲接到通知了,做出了反应,把10000技师占住了,然后…
上次写了一个socket的基本编程,但是有个问题,阻塞特别严重,于是小编便去找了nio学习了一下... public class TimeServer { public static void main(String[] args) { MultipexerTimeServer timersServer=new MultipexerTimeServer("192.168.1.102", 8400); new Thread(timersServer, "nio-多路复用器&qu…
所谓行文如编程,随笔好比java文件,文章好比类,参考文献是import,那么目录就是方法定义. 本篇文章处在分析thrift的nonblocking server之前,因为后者要依赖该篇文章的知识.若两文同一篇,那即是两类共享同一文件,其中有一个必为public,若一文在另一文中,即为内部类.按编程规范,还是分成两篇来写为好. java之NIO详解系列文章,比较好的,还是推荐这篇http://tutorials.jenkov.com/java-nio/overview.html.本文只是简略总…
一.概念 在传统的java网络编程中,都是在服务端创建一个ServerSocket,然后为每一个客户端单独创建一个线程Thread分别处理各自的请求,由于对于CPU而言,线程的开销是很大的,无限创建线程会让操作系统崩溃,因此,比较好的方法是在系统启动的时候创建一个动态的线程池,例如鼎鼎大名的服务器Tomcat,就是采用这种解决方案,然而,这种解决方案在高并发的情况下,情况就不太乐观了,当线程池大小超过CPU瓶颈的时候,相应速度,就极其低下了. 传统的java网络编程的结构图如下         …
I/O简介 I/O即输入输出,是计算机与外界世界的一个借口. IO操作的实际主题是操作系统. 在Java编程中,一般使用流的方式来处理IO,所有的IO都被视作是单个字节的移动,通过stream对象一次移动一个字节.流IO负责把对象转换为字节,然后再转换为对象. 什么是NIO NIO即New IO,这个库是在JDK1.4中才引入的.NIO主要用到的是块(缓冲),所以NIO的效率要比IO高很多. 在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO NIO和I…
NIO概述 什么是NIO? Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式. Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中. Java NIO: Non-blocking IO(非阻塞…
前言 在编程行业中,有一个东西是和广大程序员形影不离的,在最一开始接触编程就是配置它的运行环境,然后java / javac,对,这个东西就是jdk 昨天项目刚上线,可以稍微休息一下了,但是猛的闲下来,反而有点不适应,想整点什么东西,想起之前看到的一条消息,jdk15要发布了,不得不感慨信息化产业发展的速度,但是,没关系,不慌张,他强任他强,我用Java8,没办法,oracle jdk的收费政策也让生产商更加坚定的选择Java8,但是,虽然你天天在用,但是你真的了解Java8吗?比如我们经常说的…
网络编程的基本模型是Client/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接请求,通过三次握手建立连接,如果连接建立成功,双方就可以通过网络套接字(Socket)进行通信. 在基于传统同步阻塞模型开发中,ServerSocket负责绑定IP地址,启动监听端口:Socket负责发起连接操作.连接成功之后,双方通过输入和输出流进行同步阻塞式通信. 传统的BIO通信 采用BIO通信模型的服务端,通常…
NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector.传统IO基于字节流和字符流进行操作,而NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中.Selector(选择区)用于监听多个通道的事件(比如:连接打开,数据到达).因此,单个线程可以监听多个数据通道. NIO和传统IO(一下简称IO)之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的. Java IO面向流意味着每次从流中读一个…
**版权声明:本文为小斑马伟原创文章,转载请注明出处! 通道(Channel):由java.nio.channels 包定义的.Channel 表示IO 源与目标打开的连接.Channel 类似于传统的“流”.只不过Channel 本身不能直接访问数据,Channel 只能与Buffer 进行交互.     Java 为Channel 接口提供的最主要实现类如下: 1 FileChannel:用于读取.写入.映射和操作文件的通道. 2 DatagramChannel:通过UDP 读写网络中的数据…
概念讲解,转自https://www.cnblogs.com/lxzh/archive/2013/05/10/3071680.html  ,将的非常好! Buffer 类是 java.nio 的构造基础.一个 Buffer 对象是固定数量的数据的容器,其作用是一个存储器,或者分段运输区,在这里,数据可被存储并在之后用于检索.缓冲区可以被写满或释放.对于每个非布尔原始数据类型都有一个缓冲区类,即 Buffer 的子类有:ByteBuffer.CharBuffer.DoubleBuffer.Floa…
代码: package bhz.nio; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SocketChannel; public class Client { //需要一个Selector public static void main(String[] args) { //创建连接的地址 InetSocket…
此bug项目中使用elasticSearch中出现的,原因是,nio事件选择器,在特性内核下以及jdk6版本中,出现不hold线程,死循环获取事件的bug,导致cup使用率过高: 此bug在官网已被修复:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6403933 如果不升级版本, System.setProperty(“org.elasticsearch.common.netty.epollBugWorkaround”,true); 增…
1. 服务端 import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.*; import java.util.Iterator; import java.util.Set; public class GroupChatServer { private Selector selector; private ServerSoc…
1. 服务端 import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.*; import java.util.Iterator; import java.util.Set; public class NIOServer { public static void main(String[] args) throws Exception { // 1. 创建 ServerSocke…