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