Java SocketChannel虚拟类

2021/12/18 11:19:51

本文主要是介绍Java SocketChannel虚拟类,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

文章目录

  • 总结
  • SocketChannel虚拟类开启方法
  • SocketChannel虚拟类连接相关方法
  • 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虚拟类的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程