项目组是做IM产品的,服务端当然用的是NIO技术做通信底层。但是一直都是对NIO有些理论的了解,没有实践,最近有空了,就实践了下NIO。
NIO,新IO,也称之为非阻塞IO。非阻塞是它跟传统IO的最重要的区别之一。传统IO用Socket进行通信,NIO则用channel进行消息交互。channel必须注册到selector上,把它感兴趣的事件告诉selector。这是个观察者模式的实现。...
分类:
编程语言 时间:
2015-06-10 19:27:22
阅读次数:
134
接上一篇NIO学习系列:核心概念及基本读写?,本文继续探讨和学习缓冲区的内部实现机制。 5.??? 缓冲区内部实现? ?? 从上面对NIO的学习中,我们知道每一个缓冲区都有复杂的内部统计机制,它会跟踪已经读了多...
分类:
其他好文 时间:
2015-02-26 16:50:19
阅读次数:
138
1.??? 引言? ?? I/O流或者输入/输出流指的是计算机与外部世界或者一个程序与计算机的其余部分的之间的接口。新的输入/输出(NIO)库是在JDK 1.4中引入的。NIO弥补了原来的I/O的不足,它在标准Java代码中提供了...
分类:
其他好文 时间:
2015-02-15 12:17:02
阅读次数:
202
io与nio区别:
io是面向流的, nio是面向缓冲区的(速度快)
io是线程阻塞的,nio是线程非阻塞的,所以在nio中一个单独的线程可以处理多个输入和输出通道(channel)的操作
服务端:
selector:
channel_1(key的属性为accept) —— 对应 socket_1
循环遍历key建立与客户端连接
>-返回key
channe...
分类:
其他好文 时间:
2015-01-27 01:56:00
阅读次数:
168
package?chapter1;
import?java.io.File;
import?java.io.IOException;
import?java.nio.file.LinkOption;
import?java.nio.file.Path;
import?java.nio.file.Paths;
/**
?*?定义Path?对象
?*?
?...
分类:
编程语言 时间:
2015-01-07 17:02:01
阅读次数:
225
SocketChannel
Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道。可以通过以下2种方式创建SocketChannel:
打开一个SocketChannel并连接到互联网上的某台服务器。一个新连接到达ServerSocketChannel时,会创建一个SocketChannel。
打开 SocketChannel
下面是So...
分类:
编程语言 时间:
2015-01-05 16:43:06
阅读次数:
146
Selector
Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件。这样,一个单独的线程可以管理多个channel,从而管理多个网络连接。
为什么使用Selector?
仅用单个线程来处理多个Channels的好处是,只需要更少的线程来处理通道。事实上,可以只用一个线程处理所有的通道。对于操作系统来说,线程之...
分类:
编程语言 时间:
2015-01-05 16:42:24
阅读次数:
174
ServerSocketChannel
Java NIO中的 ServerSocketChannel 是一个可以监听新进来的TCP连接的通道, 就像标准IO中的ServerSocket一样。ServerSocketChannel类在 java.nio.channels包中。
ServerSocketChannel serverSocketChannel = ServerSocketChan...
分类:
编程语言 时间:
2015-01-05 16:42:02
阅读次数:
121
FileChannel
Java NIO中的FileChannel是一个连接到文件的通道。可以通过文件通道读写文件。
FileChannel无法设置为非阻塞模式,它总是运行在阻塞模式下。
打开FileChannel
在使用FileChannel之前,必须先打开它。但是,我们无法直接打开一个FileChannel,需要通过使用一个InputStream、OutputS...
分类:
编程语言 时间:
2015-01-05 16:41:10
阅读次数:
178
Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(译者注:Channel在中文经常翻译为通道)中读取或者写入到Channel的操作。
分散(scatter)从Channel中读取是指在读操作时将读取的数据写入多个buffer中。因此,Channel将从Channel中读取的数据“分散(scatter)”到多个Buffer中。
聚集(ga...
分类:
编程语言 时间:
2015-01-04 19:20:07
阅读次数:
189