socket是网络编程的基础,通过socket不同的计算机之间可以进行数据的交互。
JAVA中IO操作是阻塞的,每个操作都要创建一个线程,容易对资源造成浪费。而NIO的出现解决了这一点,NIO可以通过Selector在单线程的情况下管理多个网络连接。
IO是面向流的而NIO是面向缓冲区的,NIO属于非阻塞IO。
NIO的核心主要由Buffer,Channel,Selector组成
1.Buffer是内存中的一块,主要用来获取数据,有三大核心:position,limit,capacity
最好理解的当然是 capacity,它代表这个缓冲区的容量,一旦设定就不可以更改。比如 capacity 为 1024 的 IntBuffer,代表其一次可以存放 1024 个 int 类型的值。
一旦 Buffer 的容量达到 capacity,需要清空 Buffer,才能重新写入值。
从写操作模式到读操作模式切换的时候(flip),position 都会归零,这样就可以从头开始读写了。
写操作模式下,limit 代表的是最大能写入的数据,这个时候 limit 等于 capacity。
写结束后,切换到读模式,此时的 limit 等于 Buffer 中实际的数据大小,因为 Buffer 不一定被写满了。
2.所有的 NIO 操作始于通道,通道是数据来源或数据写入的目的地,主要地, java.nio 包中主要实现的以下几个 Channel
FileChannel:文件通道,用于文件的读和写
DatagramChannel:用于 UDP 连接的接收和发送
SocketChannel:把它理解为 TCP 连接通道,简单理解就是 TCP 客户端
ServerSocketChannel:TCP 对应的服务端,用于监听某个端口进来的请求
3.Selector是Java NIO中的一个组件,用于检查一个或多个NIO Channel的状态是否处于可读、可写
如此可以实现单线程管理多个channels,也就是可以管理多个网络链接
如果在客户端应用且连接数<1000并且并发程度不高的情况下nio不一定更快