《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,一般是服务器实现
类层次结构
本文章为连载内容,大家可以持续关注小编,我将尽其所能的为大家提供技术性实践资料、文章、视频。
感谢大家的支持!