文档章节

第三章 - 通道

jepacd
 jepacd
发布于 2016/08/27 18:02
字数 774
阅读 6
收藏 1

3 - Socket通道

新的socket通道类可以运行非阻塞模式并且是可选择的。这两个性能可以激活大程序(如网络服务器和中间件组件)巨大的可伸缩性和灵活性。本节中我们会看到,再也没有为每个socket连接使用一个线程的必要了,也避免了管理大量线程所需的上下文交换总开销。借助新的NIO类,一个或几个线程就可以管理成百上千的活动socket连接了并且只有很少甚至可能没有性能损失。

  • DatagramChannelSocketChannel:定义读和写功能的接口
  • ServerSocketChannel: 不实现读和写,负责监听传入的连接和创建新的SocketChannel对象,本身不传输数据

socket和socket通道之间的关系: 通道是一个连接I/O服务导管并提供与该服务交互的方法。就某个socket而言,它不会再次实现与之对应的socket通道类中的socket协议API,而java.net中已经存在的socket通道都可以被大多数协议操作重复使用

DatagramChannel、SocketChannel和ServerSocketChannel在被实例化时都会创建一个对等socket对象。这些是我们所熟悉的来自java.net的类(Socket、ServerSocket和DatagramSocket),它们已经被更新以识别通道。对等socket可以通过调用socket( )方法从一个通道上获取。此外,这三个java.net类现在都有getChannel( )方法。虽然每个socket通道(在java.nio.channels包中)都有一个关联的java.net socket对象,却并非所有的socket都有一个关联的通道。如果您用传统方式(直接实例化)创建了一个Socket对象,它就不会有关联的SocketChannel并且它的getChannel( )方法将总是返回null。Socket通道委派协议操作给对等socket对象。如果在通道类中存在似乎重复的socket方法,那么将有某个新的或者不同的行为同通道类上的这个方法相关联。

3.1 - 非阻塞

Socket通道可以在非阻塞模式下运行。传统Java socket的阻塞性质曾经是Java程序可伸缩性的最重要制约之一。非阻塞I/O是许多复杂的、高性能的程序构建的基础。要把一个socket通道置于非阻塞模式,我们要依靠所有socket通道类的公有超级类:SelectableChannel。

非阻塞I/O和可选择性是紧密相连的,那也正是管理阻塞模式的API代码要在SelectableChannel超级类中定义的原因。

ServerSocketChannel serverChannel = ServerSocketChannel.open();
System.out.println("通道是否是阻塞模式: " + serverChannel.isBlocking());
 // 设置通道为非阻塞 true: 阻塞
serverChannel.configureBlocking(false);
System.out.println("通道是否是阻塞模式: " + serverChannel.isBlocking());
通道是否是阻塞模式: true
通道是否是阻塞模式: false

3.2 - ServerSocketChannel

ServerSocketChannel是一个基于通道的socket监听器。它同我们所熟悉的java.net.ServerSocket执行相同的基本任务,不过它增加了通道语义,因此能够在非阻塞模式下运行

© 著作权归作者所有

jepacd
粉丝 5
博文 153
码字总数 210363
作品 0
朝阳
程序员
私信 提问
JAVA区块链项目实战视频课程

课程介绍 全国首套,基于java的区块链实战教程。目的是让更多的java编程者了解区块链,掌握区块链开发。 1、区块链理论:以node.js例子区块链原理有深刻理解; 2、区块链java实战:深刻理解区...

小红牛
2018/09/14
0
0
谁的青春不迷茫,IT路在何方?

由一封离职信说起 或许你是一个大学生,面临着成长的困惑与障碍,不知道未来做什么;或许你是一个传统IT工程师,发展到达瓶颈,对未来充满迷茫;或许你正从事其他类型工作,想转行到高速发展...

王礼Leon
2017/07/28
0
0
第三章 学习OpenCV——初探OpenCV

第三章 学习OpenCV——初探OpenCV 目录 第三章 学习OpenCV初探OpenCV 例3-1 使用cvSetImageROI来增加某范围的像素 调用cvSetImageROI()函数来构造RIO,实现对图像指定范围的蓝色通道增加1...

swjtu_lisanshi
2017/03/20
0
0
Java NIO:前言

前言 计算机毫无用处,除了答案什么也没有。 ——毕加索 本书介绍了 Java 平台上的高级输入/输出,具体点说,就是使用 Java 2 标准版(J2SE)软件 开发包(SDK)1.4 及以后版本进行的输入/...

残刃O
2018/01/13
26
0
数据分析师-从零入门到精通

或许你是在校生,想毕业后从事数据分析工作但找不着门路;或许你现在在从事传统行业工作,想转行做数据分析工作但不知如何入门;或许你在当前工作中,需要用到数据分析技能与方法,但不知道如...

王礼Leon
2017/08/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql-connector-java升级到8.0后保存时间到数据库出现了时差

在一个新项目中用到了新版的mysql jdbc 驱动 <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>8.0.18</version> ......

ValSong
今天
5
0
Spring Boot 如何部署到 Linux 中的服务

打包完成后的 Spring Boot 程序如何部署到 Linux 上的服务? 你可以参考官方的有关部署 Spring Boot 为 Linux 服务的文档。 文档链接如下: https://docs.ossez.com/spring-boot-docs/docs/r...

honeymoose
今天
6
0
Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
9
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
5
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部