java nio详解

游戏服务端核心是socket服务,而java提供了传统的bio与nio,而要满足服务端的高性能与高并发无疑要选择nio作为开发首选.

什么是nio

nio即non-blocking io,nio是基于事件驱动思想的,实现上通常采用Reactor模式.当程序发起io的读或者写操作时是非阻塞的,当socket有流可读入或者可写入时,操作系统会通知应用程序进行处理,处理完后再将流再写回缓冲区或者操作系统.对于网络io来说,主要是连接建立,流读取与流写入三种事件.需要注意的是,linux 2.6以后的版本采用epoll方式实现nio.

什么是aio

aio即async io,同样aio也是基于事件驱动思想的,但实现上通常采用Proactor模式.当程序发起io的读或者写操作时是异步的,只需要调用相应的read或者write方法.当socket有流可读入时,操作系统会将流传入read方法缓冲区,并通知应用程序,而当流有可写入时,操作系统会将流写入完毕后通知应用程序.相比nio,aio不仅简化了开发,而且省去了遍历Selector的代价.但aio只在java 7中提供,而我们目前还是先研究java 6中的nio.

核心类

  • Channel
  • Channel表现了一个可以进行io操作的通道(比如通过FileChannel我们可以对文件进行读写操作),channel可处于打开或关闭状态,并且一般情况下通道对于多线程的访问是安全的.而我们在开发时,主要会用到ServerSocketChannel与SocketChannel.SocketChannel主要用于建立连接,监听事件以及读写操作,ServerSocketChannel主要用户监听端口与监听连接事件.

  • Selector
  • Selector从字面来说它其实表示一个选择器,如果从专业性上说Selector表示多路开关选择器,而一个选择器可以管理多个信道上的io操作.

  • ByteBuffer
  • 在nio里,数据的读写操作都是屯缓冲区关联,Channel将数据流读入缓冲区,然后应用程序再从缓冲区访问数据.写数据时,则是将要发送的数据按顺序写入缓冲区.而这个缓冲区与数组类似,它里面的所有元素都是基本数据类型,并且此缓冲区是定长的,它不可扩展容量,并且满足0 <= 标记 <= 位置 <= 限制 <= 容量的不等式.目前我们使用最频繁的则是ByteBuffer,在mina中则是IoBuffer.

核心API用法

  • Channel与Selector
  • ServerSocketChannel

    SocketChannel与Selector

  • ByteBuffer
  • 输入结果如下,其实这里我们完成可以把ByteBuffer当做一个byte数组使用

    输入结果如下

    输入结果如下,可以看到position方法能设置当前ByteBuffer的位置.

    输入结果如下,可以看到limit方法能设置当前ByteBuffer的限制,但不能读取limit位置后面的内容.

    输入结果如下,可以看到设置mark后使用reset方法能将缓冲区的位置重置为以前标记的位置.

    输入结果如下,可以看到将位置设置为0,将限制设置为容量,并丢弃标记,但不会清除buffer中数据.

    输入结果如下,可以看到flip后,首先将限制设置为当前位置,然后将position设置为0,如果已定义了标记,则丢弃该标记.

发表评论(沙发空缺中,还不快抢~)

设置头像

*