非常好的一边文章介绍nio的。
http://www.iteye.com/topic/834447
目前看的一头雾水。
IO 是主存和外部设备 ( 硬盘、终端和网络等 ) 拷贝数据的过程。 IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成。
所有语言运行时系统提供执行 I/O 较高级别的工具。 (c 的 printf scanf,java 的面向对象封装 )
Java 标准 IO 类库是 io 面向对象的一种抽象。基于本地方法的底层实现,我们无须关注底层实现。 InputStream\OutputStream( 字节流 ):一次传送一个字节。 Reader\Writer( 字符流 ) :一次一个字符
nio 是 java New IO 的简称,在 jdk1.4 里提供的新 api 。 Sun 官方标榜的特性如下:
– 为所有的原始类型提供 (Buffer) 缓存支持。
– 字符集编码解码解决方案。
– Channel :一个新的原始 I/O 抽象。
– 支持锁和内存映射文件的文件访问接口。
– 提供多路 (non-bloking) 非阻塞式的高伸缩性网络 I/O 。
Buffer&Chanel
Channel 和 buffer 是 NIO 是两个最基本的数据类型抽象。
Buffer:
– 是一块连续的内存块。
– 是 NIO 数据读或写的中转地。
Channel:
– 数据的源头或者数据的目的地
– 用于向 buffer 提供数据或者读取 buffer 数据 ,buffer 对象的唯一接口。
– 异步 I/O 支持
一个 buffer 主要由 position,limit,capacity 三个变量来控制读写的过程。此三个变量的含义见如下表格:
参数 |
写模式 |
读模式 |
position |
当前写入的单位数据数量。 |
当前读取的单位数据位置。 |
limit |
代表最多能写多少单位数据和容量是一样的。 |
代表最多能读多少单位数据,和之前写入的单位数据量一致。 |
capacity |
buffer 容量 |
buffer 容量 |
Buffer 常见方法:
flip(): 写模式转换成读模式
rewind() :将 position 重置为 0 ,一般用于重复读。
clear() :清空 buffer ,准备再次被写入 (position 变成 0 , limit 变成 capacity) 。
compact(): 将未读取的数据拷贝到 buffer 的头部位。
mark() 、 reset():mark 可以标记一个位置, reset 可以重置到该位置。
Buffer 常见类型: ByteBuffer 、 MappedByteBuffer 、 CharBuffer 、 DoubleBuffer 、 FloatBuffer 、 IntBuffer 、 LongBuffer 、ShortBuffer 。
channel 常见类型 :FileChannel 、 DatagramChannel(UDP) 、 SocketChannel(TCP) 、 ServerSocketChannel(TCP)
---------------------------------------------------------------------------------------------
学习资料:http://blog.csdn.net/haoel/article/details/2224069
http://developer.51cto.com/art/201112/306489.htm
http://www.blogjava.net/19851985lili/articles/93524.html 最全的一篇 介绍
http://www.360doc.com/content/12/0317/02/8426738_195051284.shtml
http://www.blogjava.net/wfeng007/archive/2008/04/06/191112.html java NIO: selector 机制分析
http://www.cnblogs.com/daidu/archive/2009/11/06/1597264.html 一个thread处理多个客户端
http://www.klstudio.com/post/179.html baseSocket as3的封装
就是需要用一个线程接受连接socket 另一个读取数据 你从channel里读到buffer里 然后再get出来想要的东西 先放进buffer里 然后读取
你们flash会有一个843的端口 我会连接你给你发个策略文件 然后你连接我的socket
我会有俩个线程 一个线程是来判断有没有客户端连接 有的话我就存起来
还有一个是线程是来读取你发过来的数据做处理 每个连接进来的客户端我会做一类 存下来 判断是谁发的 我就直接把数据转换成byte数组 放到NIO的通道channel里 我只要向channel里写东西 他就发送给你了
http跟socket的不同:http是在socket之上的一层协议封装 socket更底层 http底层也是用socket通信的 可以
自定义协议
协议内容:包长-校验码-协议类型-内容
粘包现象:因为在连续发包时,多个包可能会粘在一起被发给另一端,另一端的socket事件触发时,收到的数据就是多个包连在一起的。没包长,就解析不出。
断包现象:还有断包现象,就是另一端收到半个包的数据,过一会才收到另一半数据。
校验码:这个校验码只是防内容数据在网络中被别人篡改用的。
前端:做socket通信都是把收到的数据放进缓冲区(比如ByteArray中),不足一个包的,就等会。大于等于一个包就让包解析算法去解。
SelectionKey
代表了 Selector 和 SelectableChannel 的注册关系。
Selector 定义了 4 个静态常量来表示 4 种 IO 操作,这些常量可以进行位操作组合成一个 bit mask 。
int OP_ACCEPT
有新的网络连接可以 accept , ServerSocketChannel 支持这一非阻塞 IO 。
int OP_CONNECT
代表连接已经建立(或出错), SocketChannel 支持这一非阻塞 IO 。
int OP_READ
int OP_WRITE
代表了读、写操作。
Selector 定义了 4 个静态常量来表示 4 种 IO 操作,这些常量可以进行位操作组合成一个 bit mask 。
ServerSocketChannel
支持非阻塞操作,对应于 java.net.ServerSocket 这个类,提供了 TCP 协议 IO 接口,支持 OP_ACCEPT 操作。
SocketChannel
支持非阻塞操作,对应于 java.net.Socket 这个类,提供了 TCP 协议 IO 接口,支持 OP_CONNECT , OP_READ 和 OP_WRITE 操作。