美文网首页架构师+大数据
程序员技术之Java NIO 中的 Channel是什么?有什么

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

作者: A尚学堂Nancy老师 | 来源:发表于2018-10-29 21:37 被阅读1次

    《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是什么?有什么

        本文链接:https://www.haomeiwen.com/subject/bxiitqtx.html