java nio组建socket后台笔记

非常好的一边文章介绍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://code.google.com/p/halo-cloud/source/browse/JavaClient/src/main/java/command/com/guzzservices/rpc/socket/SocketCommandService.java guzz框架

 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 操作。


原文地址:https://www.cnblogs.com/as3lib/p/2400600.html