zoukankan      html  css  js  c++  java
  • 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 操作。


  • 相关阅读:
    利用Filter和拦截器,将用户信息动态传入Request方法
    Spring统一返回Json工具类,带分页信息
    ASP.NET MVC4 学习记录
    lightgbm 的简单实践案例
    numpy和pandas 各种比较常见的用法总结
    【数据预处理】如何将某一类别特征的极少数类别归为一类
    十大经典算法之Apriori 算法
    常用函数框架
    【解决方案】django初始化执行python manage.py migrate命令后,除default数据库之外的其他数据库中的表没有创建出来
    【解决方案】M2Crypto不支持python3
  • 原文地址:https://www.cnblogs.com/as3lib/p/2400600.html
Copyright © 2011-2022 走看看