深入Java网络编程与NIO

Posted 进击的算法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入Java网络编程与NIO相关的知识,希望对你有一定的参考价值。

Java NIO 学习总结

NIO的特性/NIO与IO区别:

  • 1)IO是面向流的,NIO是面向缓冲区的;
  • 2)IO流是阻塞的,NIO流是不阻塞的;
  • 3)NIO有选择器,而IO没有。

读数据和写数据方式:

  • 从通道进行数据读取 :创建一个缓冲区,然后请求通道读取数据。
  • 从通道进行数据写入 :创建一个缓冲区,填充数据,并要求通道写入数据。

NIO三大核心组件:Channels 、Buffers 、Selectors

1.Buffers

技术分享图片
其实核心是最后的 ByteBuffer,前面的一大串类只是包装了一下它而已,我们使用最多的通常也是 ByteBuffer。
MappedByteBuffer 用于实现直接内存映射mmp。

Buffer 和数组差不多,它有 position、limit、capacity 几个重要属性。put() 一下数据、flip() 切换到读模式、然后用 get() 获取数据、clear() 一下清空数据、重新回到 put() 写入数据。

(1)mmp 和 Direct Buffer

2.Channels

技术分享图片

FileChannel:文件通道,用于文件的读和写
DatagramChannel:用于 UDP 连接的接收和发送
SocketChannel:把它理解为 TCP 连接通道,简单理解就是 TCP 客户端
ServerSocketChannel:TCP 对应的服务端,用于监听某个端口进来的请求

(1)

3.Selectors

Selector 建立在非阻塞的基础之上,大家经常听到的多路复用世界中指的就是它,用于实现一个线程管理多个 Channel。

对于 Selector,我们还需要非常熟悉以下几个方法:

1. select()

调用此方法,会将上次 select 之后的准备好的 channel 对应的 SelectionKey 复制到 selected set 中。如果没有任何通道准备好,这个方法会阻塞,直到至少有一个通道准备好。

2. electNow()

功能和 select 一样,区别在于如果没有准备好的通道,那么此方法会立即返回 0。

3. select(long timeout)

看了前面两个,这个应该很好理解了,如果没有通道准备好,此方法会等待一会

4. wakeup()

这个方法是用来唤醒等待在 select() 和 select(timeout) 上的线程的。如果 wakeup() 先被调用,此时没有线程在 select 上阻塞,那么之后的一个 select() 或 select(timeout) 会立即返回,而不会阻塞,当然,它只会作用一次。






以上是关于深入Java网络编程与NIO的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat NIO线程模型深入分析

Java中Nio编程实现网络编程的多客户端与服务器连接完整步骤

高性能异步事件驱动的NIO框架,结合英雄传说项目深入剖析Netty

Java NIO的深入研究6JAVA NIO之Scatter/Gather

Java NIO的深入研究 ServerSocketChannel

Java NIO: Non-blocking Server 非阻塞网络服务器