程序员技术之Java NIO 中的 Channel是什么?有什么特点?

《Java网络编程面试题》

出版单位:北京尚学堂优效学院

优效学院由清华大学著名的IT教育领导者马士兵老师创办,是一家线上线下相互融合的互联网+培训机构。公司均由海外留学生和国内行业精英人士担任授课讲师,主要成员均硕士且拥有十多年的行业经验。毕业学生就职于国内BAT以及海外著名公司。优效学院,名师执教,高效学习,成就未来。

著:张洋

优效学院_张洋老师

11年工作经验 曾就职联众游戏(程序员)、众信旅游(Team Leader)、精智教育(联合创始人)、中国石化(大数据高级顾问) 精通javaEE体系、互联网产品架构,熟悉Sap Bw/HANA、多个大数据项目经验。

20180926版


Java NIO 中的 Channel是什么?有什么特点?

Channel

Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道。

可以通过以下2种方式创建SocketChannel:

1. 打开一个SocketChannel并连接到互联网上的某台服务器。

2. 一个新连接到达ServerSocketChannel时,会创建一个SocketChannel。

打开 SocketChannel 下面是SocketChannel的打开方式:

SocketChannel socketChannel = SocketChannel.open();

socketChannel.connect(new InetSocketAddress("http://jenkov.com", 80));

关闭 SocketChannel

当用完SocketChannel之后调用SocketChannel.close()关闭SocketChannel:

socketChannel.close();

从 SocketChannel 读取数据

要从SocketChannel中读取数据,调用一个read()的方法之一。

ByteBuffer buf = ByteBuffer.allocate(48);

int bytesRead = socketChannel.read(buf);

非阻塞模式

可以设置 SocketChannel 为非阻塞模式(non-blocking mode).设置之后,就可以在异步模式下调用connect(), read() 和write()了。

如果SocketChannel在非阻塞模式下,此时调用connect(),该方法可能在连接建立之前就返回了。为了确定连接是否建立,可以调用finishConnect()的方法。

像这样:

socketChannel.configureBlocking(false);

socketChannel.connect(new InetSocketAddress("http://jenkov.com", 80));

while(! socketChannel.finishConnect() ){

//wait, or do something else...

}

Java NIO Channel通道和流非常相似,主要有以下几点区别:

· 通道可以读也可以写,流一般来说是单向的(只能读或者写,所以之前我们用流进行IO操作的时候需要分别创建一个输入流和一个输出流)。

· 通道可以异步读写。

· 通道总是基于缓冲区Buffer来读写。

Java NIO中最重要的几个Channel的实现:

· FileChannel: 用于文件的数据读写

· DatagramChannel: 用于UDP的数据读写

· SocketChannel: 用于TCP的数据读写,一般是客户端实现

· ServerSocketChannel: 允许我们监听TCP链接请求,每个请求会创建会一个SocketChannel,一般是服务器实现

类层次结构

类层次结构


本文章为连载内容,大家可以持续关注小编,我将尽其所能的为大家提供技术性实践资料、文章、视频。

感谢大家的支持!

你可能感兴趣的:(程序员技术之Java NIO 中的 Channel是什么?有什么特点?)