ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java SocketChannel虚拟类

2021-12-18 11:03:48  阅读:186  来源: 互联网

标签:Java 读取 写入 虚拟 缓冲区 接字 SocketChannel 通道


文章目录

总结

  1. SocketChannel虚拟类是面向流的多路复用套接字通道
  2. 套接字通道是通过调用此类的open方法之一创建的,无法为任意预先存在的套接字创建通道。新创建的套接字通道已打开,但尚未连接。 试图在未连接的通道上调用I/O操作将导致抛出NotYetConnectedException ,套接字通道可以通过调用其connect方法进行连接,一旦连接,socket通道将保持连接状态,直到其关闭。套接字通道是否连接可以通过调用其isConnected方法来确定
  3. 套接字通道支持非阻塞连接:可以创建套接字通道,并且可以通过connect方法启动建立到远程套接字的链接的过程,以便稍后通过finishConnect方法判断连接是否完成。可以通过调用isConnectionPending方法来确定连接操作是否正在进行
  4. 套接字通道支持异步关闭,这类似于Channel类中指定的异步关闭操作。如果套接字的输入端被一个线程关闭,而另一个线程在套接字通道上的读取操作中被阻塞, 那么被阻塞线程中的读取操作将在不读取任何字节的情况下完成,并返回-1,如果套接字的输出端被一个线程关闭,而另一个线程在套接字通道上的写入操作中被阻塞,那么被阻塞的线程将收到AsynchronousCloseException
  5. 套接字通道可由多个并发线程安全使用,它们支持并发读写,但在任何给定时间,最多一个线程可能正在读,最多一个线程可能正在写。connect和finishConnect方法相互同步(阻塞), 在调用其中一个方法时尝试启动读或写操作将被阻止,直到调用完成

SocketChannel虚拟类开启方法

方法名作用
static SocketChannel open()打开一个套接字通道
static SocketChannel open(SocketAddress remote)打开套接字通道并将其连接到远程地址
final int validOps()返回标识此通道支持的操作的操作集,如进行连接、接收数据、读取数据
abstract SocketChannel bind(SocketAddress local)将该套接字通道SocketChannel绑定在给定的套接字地址SocketAddress,即监听哪个端口
abstract SocketChannel setOption(SocketOption name, T value)设置通道套接字选项,具体选项看StandardSocketOptions

SocketChannel虚拟类连接相关方法

方法名作用
abstract SocketChannel shutdownInput()关闭通道的读取功能但仍然可以发送,不关闭通道
abstract SocketChannel shutdownOutput()关闭通道的写入功能但是仍然可以读取,不关闭通道
abstract Socket socket()获取与此通道关联的套接字
abstract boolean isConnected()判断此通道的网络套接字是否已连接
abstract boolean isConnectionPending()判断此通道上是否正在进行连接操作,当且仅当此通道上的连接操作已启动,且调用finishConnect方法未完成时,此时调用该方法返回true
abstract boolean connect(SocketAddress remote)将此通道的套接字连接到远程地址
abstract boolean finishConnect()判断此通道是否完成远程连接,如果此通道已连接,则此方法不会阻塞,并将立即返回true, 如果此通道处于非阻塞模式,则如果连接过程尚未完成,则此方法将返回false,如果此通道处于阻塞模式,则此方法将阻塞,直到连接完成或失败, 并且将始终返回true或抛出描述失败的已检查异常
abstract SocketAddress getRemoteAddress()返回此通道的套接字连接到的远程地址
abstract SocketAddress getLocalAddress()获取本地套接字地址

SocketChannel虚拟类读取写入字节序列方法

方法名作用
abstract int read(ByteBuffer dst)单个读取,从该通道将字节序列读取并填入到给定的缓冲区ByteBuffer,返回的int表示读取的字节个数,可以随时调用此方法。但是,如果另一个线程已经在此通道上启动了读取操作,则此方法的调用将被阻止,直到第一个操作完成。读取之前会判断缓冲区是否还有空闲空间,如果没有则不会从通道读取字节序列
abstract long read(ByteBuffer[] dsts, int offset, int length)分散读取,从该通道将字节序列读入给定缓冲区的子序列,从通道读取数据填满缓冲区数组从offset下标开始往后length个缓冲区ByteBuffer,返回的long表示总共读取的字节数
final long read(ByteBuffer[] dsts) throws IOException分散读取,将字节序列从此通道读入给定的缓冲区序列,从通道读取数据把缓冲区数组ByteBuffer[]所有缓冲区ByteBuffer全部填满 ,返回的long表示总共读取的字节数
abstract int write(ByteBuffer src)单个写入,从给定缓冲区ByteBuffer 将字节序列写入此通道,返回的int表示写入通道的字节个数,可以随时调用此方法。但是,如果另一个线程已经在此通道上启动了写入操作,则此方法的调用将被阻止,直到第一个操作完成
abstract long write(ByteBuffer[] srcs, int offset, int length)聚集写入,从给定缓冲区的子序列将字节序列写入此通道,写入通道的并不只是一个缓冲区ByteBuffer,而是缓冲区数组,从缓冲区数组的offset下标处将缓冲区写入通道,一直写入length个缓冲区ByteBuffer到通道,返回的long表示总共写入的字节数
final long write(ByteBuffer[] srcs)聚集写入,从给定缓冲区将字节序列写入此通道,将缓冲区数组ByteBuffer[] 里面所有缓冲区写入到通道中,返回的long表示总共写入的字节数

标签:Java,读取,写入,虚拟,缓冲区,接字,SocketChannel,通道
来源: https://blog.csdn.net/weixin_45754452/article/details/122009356

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有