2018-10-24
NIO基础入门(五)之Socket通道&管道
[TOC]
1.概念
socket通道与File通道的不同特征为:socket通道可以非阻塞模式并且可选,可以激活大程序巨大的可伸缩性和灵活性
File通道I/O是阻塞模式(AIO更新后在使用时也可以做非阻塞)
没有必要为每个Socket通道分配一个线程的必要,也减小了频繁交换上下文开销,一个或几个线程可以管理成百上千的Socket活动,且性能损耗较小
全部的socket通道都是位于 java.nio.channels.spi包中的AbstractSelectableChannel引申而来
这意味着我们可以使用Selector对象来执行socket的有条件选择(选择和多路复用概念)
2.分类:
DatagramChannel和SocketChannel实现定义读写功能的接口
ServerSocketChannel不实现,它只负责监听传入的连接和创建新的SocketChannel对象,本身不传输数据
通道是一个连接I/O服务导管并提供服务交互的方法,
就某个socket而言,他不会再次实现与之对应的socket通道类中的socket协议API
而java.net中已存在的socket通道可以被大多数协议操作重复使用
全部Socket通道类(DatagramChannel/SocketChannel/ServerSocketChannel)在被实例化时
都会创建一个对等的socket对象,他们已经被更新以识别通道,在socket通道上使用socket()方法可以获得该对象
注意:传统的直接实例化socket对象,不会产生关联的socket通道,并且getChannel()方法返回也为空
3.非阻塞模式
Socket通道可以在非阻塞模式下运行,传统java Socket的阻塞曾经是java程序可伸缩性的重要约束之一
非阻塞I/O是许多复杂/高性能程序/框架的基础
要把一个Socket通道置于非阻塞模式,需要依靠所有socket通道的共有超级类SelectableChannel
SelectableChannel部分源码
1 | public abstract SelectableChannel configureBlocking(boolean block) throws IOException; //选择开启阻塞/非阻塞模式 |
模式切换示例
1 | SocketChannel socketChannel = SocketChannel.open(); |
4.ServerSocketChannel
与ServerSocket方法意义相同,区别是能在非阻塞模式下运行
源码
1 | public static ServerSocketChannel open() throws IOException //静态工厂方法创建ServerSocketChannel对象,返回一个未绑定的java.net.ServerSocket关联的通道,对等Socket可再次基础上使用socket()方法获得 |
两种模式的绑定
1 | ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); |
Channels工具类
位于java.nio.channels.channels
详情百度(各种转换)