Java NIO之SocketChannel

Java NIO Selector , SelectionKey , SocketChannel , ServerSocketChannel 一    NIO介绍 1. NIO是非阻塞的     NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内容,假如没有内容进来,read()也是傻傻的等,这会影响我们程序继续做其他事情,那么改进做法就是开设线程,让线程去等待,但是这样做也是相当耗费资源的。 ... 阅读详情

SocketChannel类

简介

该类针对面向流的连接套接字的可选择通道。

套接字通道不是连接网络套接字的完整抽象。必须通过调用 socket 方法所获得的关联 Socket 对象来完成对套接字选项的绑定、关闭和操作。不可能为任意的已有套接字创建通道,也不可能指定与套接字通道关联的套接字所使用的 SocketImpl 对象。

通过调用此类的某个 open 方法创建套接字通道。新创建的套接字通道已打开,但尚未连接。试图在未连接的通道上调用 I/O 操作将导致抛出 NotYetConnectedException。可通过调用套接字通道的 connect 方法连接该通道;一旦连接后,关闭套接字通道之前它会一直保持已连接状态。可通过调用套接字通道的 isConnected 方法来确定套接字通道是否已连接。

套接字通道支持非阻塞连接:可创建一个套接字通道,并且通过 connect 方法可以发起到远程套接字的连接,之后通过 finishConnect 方法完成该连接。可通过调用 isConnectionPending 方法来确定是否正在进行连接操作。

可单独地关闭 套接字通道的输入端和输出端,而无需实际关闭该通道。调用关联套接字对象的 shutdownInput 方法来关闭某个通道的输入端将导致该通道上的后续读取操作返回 -1(指示流的末尾)。调用关联套接字对象的 shutdownOutput 方法来关闭通道的输出端将导致该通道上的后续写入操作抛出 ClosedChannelException。

套接字通道支持异步关闭,这与 Channel 类中所指定的异步 close 操作类似。如果一个线程关闭了某个套接字的输入端,而同时另一个线程被阻塞在该套接字通道上的读取操作中,那么处于阻塞线程中的读取操作将完成,而不读取任何字节且返回 -1。I如果一个线程关闭了某个套接字的输出端,而同时另一个线程被阻塞在该套接字通道上的写入操作中,那么阻塞线程将收到 AsynchronousCloseException。

多个并发线程可安全地使用套接字通道。尽管在任意给定时刻最多只能有一个线程进行读取和写入操作,但数据报通道支持并发的读写。connect 和 finishConnect 方法是相互同步的,如果正在调用其中某个方法的同时试图发起读取或写入操作,则在该调用完成之前该操作被阻塞。 代码声明为:

public abstract class SocketChannelextends AbstractSelectableChannelimplements ByteChannel, ScatteringByteChannel, GatheringByteChannel
构造方法
protected SocketChannel(SelectorProvider provider)初始化此类的一个新实例。
常用方法
public static SocketChannel open()
                          throws IOException打开套接字通道。 
通过调用系统级默认 SelectorProvider 对象的 openSocketChannel 方法来创建新的通道。 


返回:
新的套接字通道 
抛出: 
IOException - 如果发生 I/O 错误
public final int validOps()返回一个操作集,标识此通道所支持的操作。 
套接字通道支持连接、读取和写入,所以此方法返回 (SelectionKey.OP_CONNECT | SelectionKey.OP_READ | SelectionKey.OP_WRITE)。 


指定者:
类 SelectableChannel 中的 validOps
返回:
有效操作集
public abstract Socket socket()获取与此通道关联的套接字。 
返回的对象不会声明任何在 Socket 类中未声明的公共方法。 


返回:
与此通道关联的套接字
public abstract int read(ByteBuffer dst)
                  throws IOException
                  将字节序列从此通道中读入给定的缓冲区。 
尝试最多从该通道中读取 r 个字节,其中 r 是调用此方法时缓冲区中剩余的字节数,即 dst.remaining()。 

假定读取的字节序列长度为 n,其中 0 <= n <= r。此字节序列将被传输到缓冲区中,序列中的第一个字节位于索引 p 处,最后一个字节则位于索引 p + n - 1 处,其中 p 是调用此方法时缓冲区的位置。返回时,该缓冲区的位置将等于 p + n;其限制不会更改。 

读取操作可能不填充缓冲区,实际上它可能根本不读取任何字节。是否如此执行取决于通道的性质和状态。例如,处于非阻塞模式的套接字通道只能从该套接字的输入缓冲区中读取立即可用的字节;类似地,文件通道只能读取文件中剩余的字节。但是可以保证,如果某个通道处于阻塞模式,并且缓冲区中至少剩余一个字节,则在读取至少一个字节之前将阻塞此方法。 

可在任意时间调用此方法。但是如果另一个线程已经在此通道上发起了一个读取操作,则在该操作完成前此方法的调用被阻塞。 


指定者:
接口 ReadableByteChannel 中的 read
参数:
dst - 要向其中传输字节的缓冲区 
返回:
读取的字节数,可能为零,如果该通道已到达流的末尾,则返回 -1 
抛出: 
NotYetConnectedException - 如果尚未连接此通道 
ClosedChannelException - 如果此通道已关闭 
AsynchronousCloseException - 如果正在进行读取操作时另一个线程关闭了此通道 
ClosedByInterruptException - 如果正在进行读取操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程设置为中断状态 
IOException - 如果发生其他 I/O 错误
public abstract int write(ByteBuffer src)
                   throws IOException
                   将字节序列从给定的缓冲区中写入此通道。 
尝试最多向该通道中写入 r 个字节,其中 r 是调用此方法时缓冲区中剩余的字节数,即 src.remaining()。 

假定写入长度为 n 的字节序列,其中 0 <= n <= r。从缓冲区的索引 p 处开始传输该字节,其中 p 是调用此方法时该缓冲区的位置;最后写入的字节索引是 p + n - 1。返回时,该缓冲区的位置将等于 p + n;其限制不会更改。 

除非另行指定,否则仅在写入所有请求的 r 个字节后 write 操作才会返回。有些类型的通道(取决于它们的状态)可能仅写入某些字节或者可能根本不写入。例如,处于非阻塞模式的套接字通道只能写入该套接字输出缓冲区中的字节。 

可在任意时间调用此方法。但是如果另一个线程已经在此通道上发起了一个写入操作,则在该操作完成前此方法的调用被阻塞。 


指定者:
接口 WritableByteChannel 中的 write
参数:
src - 要从中获取字节的缓冲区 
返回:
写入的字节数,可能为零 
抛出: 
NotYetConnectedException - 如果尚未连接此通道 
ClosedChannelException - 如果此通道已关闭 
AsynchronousCloseException - 如果正在进行写入操作时另一个线程关闭了此通道 
ClosedByInterruptException - 如果正在进行写入操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程的状态设置为中断 
IOException - 如果发生其他 I/O 错误
CISSP/CCSP证书到手后别松懈!保姆级维持攻略:CPE积分怎么攒?年费怎么交? 本文为CISSP/CCSP持证者提供详细的维持认证攻略,重点介绍如何高效积累CPE积分和避免年费缴纳中的常见问题。通过免费与付费资源结合的策略,帮助持证者轻松完成年度认证要求,同时利用认证创造职业价值。 阅读详情

相关推荐

GB28181 2022 配置信令

基本参数视频参数选项视频参数属性配置巡航轨迹

ww506772362的专栏 1634

Java——SocketChannel

       SocketChannel是NIO形式的客户端服务器通信的形式,支持异步非阻塞连接,通过管道与缓存的形式进行通信,与Java的Socket是有区别的,socket是通过请求——连接的形式进行通信,而SocketChannel是通过建立管道的形式进行通信,原则上,SocketChannel要比Socket快,这只是自己的理解,不知道正确与否了。。。下面总结下SocketChannel...

赫家旺的博客 1319

头歌操作系统 课堂练习4.2:页式内存管理 答案 无解析

头歌操作系统 课堂练习4.2:页式内存管理 答案 无解析

kercii的博客 1万+

Java nio包SocketChannel详解

SocketChannel 是 Java NIO 中用于实现基于 TCP 协议的套接字通信的通道。在介绍SocketChannel之前先讲下Selector 。

境里婆娑 1215

430单片机实现三人投票表决器_基于单片机的五人表决器的设计

姚海云+马野摘要:本设计利用51单片机,按键开关模块,数码管显示模块和LED模块来实现一个简单的五人表决器的功能。按键开关模块中的键2~键6表示五个人,由5个人来投票,当同意的票数大于或者等于3人时,数码管显示同意的人数,说明表决通过。当表决的人数小于3时,数码管显示同意的人数。关键词:表决器;单片机;流水灯;数码管;矩阵键盘;时钟中图分类号:TP391 文献标识码:A 文章编号:1009-304...

weixin_33277215的博客 2558

下水管道损坏检测数据集总结

下水管道损坏检测数据集包含 6708 张图像,为下水管道损坏情况的检测提供了丰富的数据基础。该数据集提供了 YOLO 和 VOC 两种常见的标注方式,方便不同需求的使用者进行模型训练和研究。

crz1336768325的博客 870

NIO学习之ServerSocketChannel和SocketChannel

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

m0_53157173的博客 3792

Swin Transformer 与 CNN 结合实现图像分类

Swin Transformer 与 CNN 结合实现图像分类。(含swin transformer 结构讲解,cnn网络搭建,代码)

这里是Mae。 5027

Java NIO SocketChannel简述及示例

SocketChannel简述及demoJAVA NIO之SocketChannel1. 简述2. 特点3. 解决问题4. demo功能5. 工作原理6. 代码示例7. 涉及知识扩充 JAVA NIO之SocketChannel 1. 简述 NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,已经被越来...

weixin_38013624的博客 1062

两点调制原理以及RF DAC和PLL SDM两条输入路径理解

特性数据本质原始数字比特流 (0/1)平滑后的预失真波形数据连接对象Σ-Δ调制器 (SDM)的小数输入RF DAC在系统中的角色主调制路径:通过改变PLL分频比产生频率偏移辅助补偿路径:通过RF DAC产生补偿电压,校正PLL失真可否加入延时可以且必须。用于数字时序对齐,对性能无影响。绝对不可以。会导致补偿失配,严重破坏信号频谱。功能目标实现数字域的频率调制确保模拟域的波形和频谱完美因此,在您所描述的这种先进发射机架构中,2-point数据是数字指令,送给SDM;

m0_49540263的博客 607

C/C++基础讲解(四十三)之图形篇之绘制直线、圆、圆弧、 椭圆

程序主要是基于Visual studio 2019进行编译完成了,有兴趣的小伙伴可以自己安装下Visual studio 2019,网上有现成的教程,当然了,如果有问题,也可以和我联系,这里我们主要讲解些源码实例,不多说了,言归正传。 C语言,做为学习其他语言的基础语言,其重要性就不言而喻了.下面我将和大家一起来学习探讨C语言的相关奥秘。 实例1:绘制直线 实例2:绘制圆 实例2:绘制圆弧 实例2:绘制椭圆

hnjzfwy的博客 1236

NIO之SocketChannel,SocketChannel ,DatagramChannel解读

(1)SocketChannel 就是 NIO 对于非阻塞 socket 操作的支持的组件,其在 socket 上 封装了一层,主要是支持了非阻塞的读写。同时改进了传统的单向流 API,,Channel同时支持读写。(2)socket 通道类主要分为 DatagramChannel、SocketChannel 和 ServerSocketChannel,它们在被实例化时都会创建一个对等 socket 对象。

一个菜鸡的博客 2701

uniapp [安卓苹果App端] - errMsg“: “request:fail abort statusCode:-1 不支持的URL(-1002)Uniapp真机运行APP网络请求报错失败排查

uniapp真机运行APP,网络请求报错errMsg“: “request:fail abort statusCode:-1 不支持的URL(-1002),uni.request网路请求报错,uniApp解决请求接口报错,uniapp app端打包上线后请求报错,真机运行测试请求失败,uniapp安卓app请求报错,uniapp苹果ios平台网络请求报错,uniapp真机预览请求失败怎么办,不是跨域问题,在H5中请求可以正常发送和接收,但在真机APP上请求报错,Hbuilder真机运行app网络请求报错,全

🏆 前端领域优质创作者 3090

五、JAVA NIO(三种SocketChannel)

NIO 目录 文章目录五、JAVA NIO(三种Socket通道)1、ServerSocketChannel1.1、打开 ServerSocketChannel1.2、关闭 ServerSocketChannel1.3、监听新的连接1.4、阻塞模式1.4、非阻塞模式2、SocketChannel2.1、SocketChannel 介绍2.2、SocketChannel 特征:2.3、SocketChannel 的使用3、DatagramChannel3.1、打开 DatagramChannel3.2、接收

wang_luwei的博客 2796

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java NIO SocketChannel

用于将通道与TCP(传输控制协议)网络套接字连接。它相当于网络编程中使用的Java网络套接字(的字节数目是未知的,因此需要重复使用。Java NIO中有两种可用于创建。方法返回写入缓冲区字节数的整数值。方法执行所有操作后,可以关闭。读取的数据存储在缓冲区中。下面来看看一下将数据写入。没有可用的字节写入。

unber的博客 1083

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

java nio socketchannel_java nio之SocketChannel

Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道。可以通过以下2种方式创建SocketChannel:打开一个SocketChannel并连接到互联网上的某台服务器。一个新连接到达ServerSocketChannel时,会创建一个SocketChannel。打开 SocketChannel下面是SocketChannel的打开方式:1SocketChannel s...

weixin_42355411的博客 134

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java socketchannel_Java NIO SocketChannel

Java NIO SocketChannel用于将通道与TCP(传输控制协议)网络套接字连接。它相当于网络编程中使用的Java网络套接字(Socket)。Java NIO中有两种可用于创建SocketChannel的方法:当传入连接到达ServerSocketChannel时,可以创建它。打开一个SocketChannel,并在网络上与服务器连接。我们来看看使用选择器的SocketChannel客...

weixin_39895096的博客 266

Java NIO: SocketChannel使用详解

概述 Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道,是一种面向流连接只sockets套接字的可选择通道,特点如下: SocketChannel是用来连接Socket套接字 SocketChannel主要用途用来处理网络I/O的通道 SocketChannel是基于TCP连接传输 SocketChannel实现了可选择通道,可以被多路复用的 创建&关闭SocketChannel //方式1. SocketChannel socketChannel =

保暖透气大裤衩LeoLee的博客 5611

Java NIO 之 ServerSocketChannel SocketChannel

Java NIO 之 ServerSocketChannel/SocketChannelServerSocketChannel介绍Java NIO中ServerSocketChannel是一个可以监听新进来的TCP 连接的通道。既然是监听新的TCP连接,因此ServerSocketChannel一般用于服务器端,与Socket网络编程中的ServerSocket功能类似。在一般的编程实现的逻辑

wojiushimogui的博客 1814

java nio之SocketChannel

Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道。可以通过以下2种方式创建SocketChannel: 打开一个SocketChannel并连接到互联网上的某台服务器。 一个新连接到达ServerSocketChannel时,会创建一个SocketChannel。 打开 SocketChannel 下面是SocketChannel的打...

110

java nio 创建 channel,Java NIO SocketChannel

Java NIO SocketChannelJava NIO SocketChannel是连接到TCP网络套接字的通道。它与Java NIO等效于Java Networking的Sockets。有两种SocketChannel创建方法:您打开一个SocketChannel并连接到Internet上某个服务器。SocketChannel可以当传入连接到达一个被创建ServerSocketChanne...

weixin_39630855的博客 191

【Java NIO 简例】SocketChannel

. 原文:《Java NIO SocketChannel》 Java NIO 中的 SocketChannel 用于处理 TCP 网络连接。 开启 SocketChannel 示例:连接远程服务器 Java代码 SocketChannelchannel=SocketChannel.open(); channel.connect(newInet...

一个被IT搞的 216

Java NIO 学习笔记 - SocketChannel

为了进行非阻塞的socket通信,java nio提供Channel概念的实现。Channel概念以区别于传统的基于流概念的IO。事实上Channel概念的IO既包括非阻塞式的IO也包括阻塞式IO。要Channel完成非阻塞式IO需要实现SelectableChannel接口,与Selector关联使用。SocketChannel就是这样一个SelectableChannel。 由于,sel

Studying & Summarizing 7937
上一篇: Java类加载机制
下一篇: Java NIO之ServerSocketChannel类
Coder_py
博客等级 码龄10年 106粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值