nio

网络编程模型 nio

末鹿安然 提交于 2020-02-04 23:15:32
1.简介 nio 是new io的简称,1.4之后提供。特性:为所有的原始类型提供缓存支持(Buffer),字符集编码解码解决方案,channel一个原始的i/o抽象,支持锁和内存映射文件的文件访问接口,提供多路(non-blcoking)非阻塞式的高伸缩性网络。 2.比较 bio 同步阻塞,jdk1.4之前使用,阻塞到读写方法,阻塞到线程来提高并发性能,效果一般 nio 同步非阻塞io,jdk1.4后,linux多路复用技术,实现io的轮询方式,目前是主流的网络通信模式,netty 框架, aio 异步非阻塞io ,jdk1.7后,基于linux的epoll模式,目前使用较少, 3.基本编程模型 服务端: 核心api ServerSocket 流程 ; 先创建一个服务,然后绑定在服务器的ip地址和端口 等待客户端的链接请求 收到连接请求后,接受请求,建立了一个tcp连接 从建立的连接中获取到socket输入、输出流(同步阻塞) 通过两个流进行数据的交互 客户端: 核心api Socket 流程 : 先向服务端请求连接 一旦被服务器接受,连接就创建好了 从tcp连接中获取socket输入、输出流 通过两个流进行数据的交互 3.原理 阻塞和非阻塞:阻塞和非阻塞是进程在访问数据时,数据是否准备就绪的一种处理方式,当数据没有准备好的时候, 阻塞是往往需要等待缓冲区中的数据准备好之后才处理

Java_NIO详解

本小妞迷上赌 提交于 2020-02-04 04:04:54
目录 1. Buffer 1.1 定义 HeapByteBuffer DirectByteBuffer 1.2 Buffer的创建 1.3 Buffer的读取 1.4 Buffer复制 – 浅复制 2. Channel 3. Selector IO与NIO的区别: NIO的三大核心: Buffer Channel Selector 1. Buffer 1.1 定义 一个 Buffer 本质上是 内存中的一块 , 可以将数据写入这块内存, 从这块内存获取数据 java.nio 定义了以下几个 Buffer 的实现: Java NIO Buffer三大核心属性:position、limit、capacity capacity: 作为一个内存块,Buffer有一个固定的大小值,也叫“capacity”.你只能往里写capacity个byte、long,char等类型。一旦Buffer满了,需要将其清空(通过读数据或者清除数据)才能继续写数据往里写数据。 position: 当你写数据到Buffer中时,position表示当前的位置。初始的position值为0.当一个byte、long等数据写到Buffer后, position会向前移动到下一个可插入数据的Buffer单元。position最大可为capacity. 当读取数据时,也是从某个特定位置读

java实现文件拷贝的七种方式

一个人想着一个人 提交于 2020-02-04 02:41:00
文章目录 1. 通过字节流实现文件的拷贝 2. 通过字符流实现文件拷贝 3. 通过字节缓冲流实现文件拷贝 4. 通过字符缓冲流拷贝文件 5. 通过JAVA NIO 非直接缓冲区拷贝文件 6. 通过JAVA NIO 直接缓冲区拷贝文件 7. 通过JAVA NIO 通道传输拷贝文件 使用示例 1. 通过字节流实现文件的拷贝 /** * 通过字节流实现文件的拷贝 * @param sourcePath 源文件路径 * @param targetPath 目标文件路径 */ public static void copyFileByStream(String sourcePath,String targetPath){ //源文件路径 File source = new File(sourcePath); //目标文件路径 File target = new File(targetPath); //如果源文件不存在则不能拷贝 if(!source.exists()){ return; } //如果目标文件目录不存在则创建 if(!target.getParentFile().exists()){ target.getParentFile().mkdirs(); } try { //实现文件的拷贝 InputStream inputStream = new FileInputStream

Java NIO的多路复用及reactor

微笑、不失礼 提交于 2020-02-04 00:12:02
(from:http://developer.51cto.com/art/201112/306489.htm) 以下描述,为了说明问题,就提提历史(类似的东西,网上一搜一大把,但是希望你能在这里止步,知道到底是怎么回事。如果还是不清楚,咱就站内沟通!)。 在我(刚)看nio的这段时间里,主要接触了几个东西,就是关于server和client。java之前的io完全可以胜任,但是效率不高,为何效率不高呢? ===============history==start=============== //TODO:finish the old style of server and socket data transion. ServerSocket socket = new ServerSocket(80); while (true) { final Socket connection = socket.accept(); handleRequest(connection); } ===============history==end in the future================ 在上面的代码片段中,我们只能是一个request一个的进行处理。这使得所有的请求都阻塞了。如果我们再改变一下,将handleRequest方法封装到线程中处理: if(connection =

Reactor的NIO线程模型

一笑奈何 提交于 2020-02-04 00:11:27
1.Reactor单线程模型 传统的javaNIO通信的线程模型。该线程模型仅有一个I/O线程处理所有的I/O操作,如下图: 单线程模型的Reactor 所有的客户端都连接到一个I/O线程负责的Acceptor上,连接成功后,由Reactor里的Dispatch将接收的ByteBuffer分发到指定的Handler上处理,进行解码,业务处理,编码及发送给客户端等过程。整个过程I/O线程都是异步非阻塞方式实现。 I/O线程完成的工作: 1)服务端NIO线程用于监听客户端连接 2)客户端NIO线程用于向服务器端发送连接请求 3)客户端和服务端的读写操作 不足: 1)如果客户端同时有成百上千的请求,会导致I/O线程不停的工作,CPU利用率负荷超载,同时造成很多客户端超时得不到响应 2)一旦I/O线程出现异常,可能会导致所有客户端掉线,造成系统单点故障 2.多线程的Reactor模型 多线程模型采用1个线程接收客户端请求,同时使用1个线程池处理读写等操作。模型如下: 多线程的Reactor 其中Acceptor单线程用于 监听及接收client的连接请求 ,连接成功后会将这些连接注册到WorkThreadPool(工作线程池)的其中一个线程上,由工作线程池分出1个工作线程用于和该client的读写、编码、解码操作。一个client只能和一个工作线程对应,不能注册到多个工作线程

Java IO

前提是你 提交于 2020-02-03 00:26:33
Java IO可以从三个方面理解,即硬盘、网络和终端,在这三个方向上都存在输入输出。然后根据处理模型的不同,Java的IO处理又可以划分为BIO、NIO和AIO。 一、java.io 从传输的内容的不同,总体上可以分为两大类,即字节流和字符流。 (一)字节流 A。输入流 这里又区分为节点流和处理流,由于处理流都是装饰器流,所以都会迭代在节点流之上工作。 B。输出流 输出流当然与输入流类似,节点流可以单独使用,但是处理流需要迭代节点流来使用 (二)字符流 我们都知道计算机其实只能存储0和1,或者说字节,这里之所以还有个字符流,只是为了方便使用,底层与终端真正交互肯定还是用的字节流。 A。输入流 也是一样的体系。 B。输出流 一般建议使用处理流包装之后的节点流来处理数据,比较提供了更多的功能和灵活性。 二、Java BIO、Java NIO与Java AIO 从包空间来看,java.io中的类都是BIO,而java.nio中的类则既有NIO又有AIO。另外,还可以从同步异步以及阻塞非阻塞来理解。 同步与异步,这个主要是从接受者来区分。 同步就是发起一个请求后,接受者未处理完请求之前,不返回结果。 异步就是发起一个请求后,立刻得到接受者的回应表示已接收到请求,但是接受者并没有处理完,接受者通常依靠事件回调等机制来通知请求者其处理结果。 阻塞和非阻塞,这个主要从请求者来区分。

使用Java NIO监视文件

人走茶凉 提交于 2020-02-02 18:20:27
通过优锐课的java小课中学习到了很多重点,一起来看看了解有关使用Java NIO观看文件的更多信息。 该 java.nio.file 包提供了一个文件更改通知API,被称为 手表服务API。它使我们能够在监视服务中注册文件夹。注册时,我们告诉服务我们感兴趣的事件类型是:文件创建,文件修改或文件删除。 当服务检测到感兴趣的事件时,会将其转发到注册的进程并根据需要进行处理。基本上是这样的: 1.第一步是WatchService 使用类的newWatchService() 方法创建一个新 的 FileSystem。 2.接下来,我们使用Path 要关注的事件类型为要监视的文件夹注册一个实例。 3.最后,我们实现了一个无限循环来等待传入事件。当事件发生时,该密钥会发出信号,并放入观察者的队列中。处理完事件后,我们需要ready 通过调用其reset() 方法将其放回 状态 。如果返回false,则密钥不再有效,并且循环可以退出。 4.1 5.WatchService watchService = FileSystems.getDefault().newWatchService(); 6.2 7.Path path = Paths.get("c:\\directory"); 8.3 9.path.register(watchService, ENTRY_CREATE, ENTRY

NIO的流程以及与BIO的差别

霸气de小男生 提交于 2020-02-02 00:32:36
NIO: 同步非阻塞 ,服务器实现模式为 一个线程处理多个请求 ,即客户端发送的连接请求都会 注册到多路复用器 上,多路复用器轮询到连接有IO请求就进行处理。 连接数目多,且连接比较短,用于聊天室,弹幕系统 NIO是 JDK1.4 JAVA提供了一系列改进的输入/输出的新特性,被统称为NIO,同步非阻塞IO,相关的类都在java.nio包内 NIO的特性: NIO有三个核心部分: Channel(管道),Buffer(缓冲区),selector(选择器 ) 1.NIO是面向缓冲区,或者面向块编程的,数据读取到一个他稍后处理的缓冲区(Buffer),需要时可在缓冲区中前后移动,这就增加了处理过程中的灵活性,使用它可以提供非阻塞的高伸缩性网络。 2.Java NIO 的非阻塞模式,使一个线程从某通道发送请求或者读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取,而不是保持线程阻塞,所以直至数据变得可以读取之前,该线程可以继续做其他的事情,非阻塞写也是如此,一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程工时可以去做别的事情 3.NIO是可以做到用一个线程来处理多个操作的。假设有10000个请求过来,根据实际情况,可以分配50或者100个线程来处理,不像之前的阻塞IO那样 必须得分配10000个 4.HTTP2.0使用了多路复用技术

Tomcat 的三种(bio,nio.apr) 高级 Connector 运行模式

故事扮演 提交于 2020-02-01 14:05:16
http://itindex.net/detail/50701-tomcat-bio-nio tomcat的运行模式有3种.修改他们的运行模式.3种模式的运行是否成功,可以看他的启动控制台,或者启动日志.或者登录他们的默认页面http://localhost:8080/查看其中的服务器状态。 1)bio 默认的模式,性能非常低下,没有经过任何优化处理和支持. 2)nio 利用java的异步io护理技术,no blocking IO技术. 想运行在该模式下,直接修改server.xml里的Connector节点,修改protocol为 <Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" URIEncoding="UTF-8" useBodyEncodingForURI="true" enableLookups="false" redirectPort="8443" /> 启动后,就可以生效。 3)apr 安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能. 必须要安装apr和native,直接启动就支持apr。下面的修改纯属多余,仅供大家扩充知识,但仍然需要安装apr和native 如nio修改模式

Why is the JDK NIO using so many anon_inode file descriptors?

穿精又带淫゛_ 提交于 2020-02-01 04:52:24
问题 I'm using Sun's JDK 1.6.0_26 and NIO (with Netty) and in lsof I see hundreds of file descriptors that are anon_inode : $ lsof -np 11225 | fgrep -w anon_inode java 11225 nobody 57u 0000 0,9 0 1386 anon_inode java 11225 nobody 61u 0000 0,9 0 1386 anon_inode java 11225 nobody 65u 0000 0,9 0 1386 anon_inode java 11225 nobody 69u 0000 0,9 0 1386 anon_inode java 11225 nobody 73u 0000 0,9 0 1386 anon_inode java 11225 nobody 77u 0000 0,9 0 1386 anon_inode java 11225 nobody 81u 0000 0,9 0 1386 anon