- 所有已实现的接口:
Closeable,AutoCloseable,ByteChannel,Channel,GatheringByteChannel,InterruptibleChannel,NetworkChannel,ReadableByteChannel,ScatteringByteChannel,WritableByteChannel
通过调用此类的 open 方法之一创建套接字通道。 no-arg open 方法为一个互联网协议插座。 open(ProtocolFamily) 方法用于为指定协议族的套接字打开套接字通道。不可能为任意的、预先存在的套接字创建通道。新创建的套接字通道已打开但尚未连接。尝试在未连接的通道上调用 I/O 操作将导致抛出 NotYetConnectedException 。可以通过调用其connect 方法来连接套接字通道;一旦连接,套接字通道将保持连接状态,直到它被关闭。套接字通道是否已连接可通过调用其isConnected 方法来确定。
套接字通道支持非阻塞连接:可以创建套接字通道,建立到远程套接字的链接的过程可以通过connect 方法启动,稍后由finishConnect 方法完成。连接操作是否正在进行可以通过调用isConnectionPending 方法来确定。
套接字通道支持异步关机,类似于Channel 类中指定的异步关闭操作。如果套接字的输入端被一个线程关闭,而另一个线程在套接字通道上的读取操作中被阻塞,则被阻塞线程中的读取操作将完成而不读取任何字节,并将返回 -1 。如果套接字的输出端被一个线程关闭,而另一个线程在套接字通道上的写操作中被阻塞,那么被阻塞的线程将收到一个 AsynchronousCloseException 。
使用 setOption 方法配置套接字选项。套接字通道互联网协议套接字支持以下选项:
选项名称 Description SO_SNDBUF套接字发送缓冲区的大小 SO_RCVBUF套接字接收缓冲区的大小 SO_KEEPALIVE保持连接 SO_REUSEADDR重复使用地址 SO_LINGER如果存在数据则在关闭时停留(仅在阻塞模式下配置时) TCP_NODELAY禁用 Nagle 算法
套接字通道Unix域套接字支持:
选项名称 Description SO_SNDBUF套接字发送缓冲区的大小 SO_RCVBUF套接字接收缓冲区的大小 SO_LINGER如果存在数据则在关闭时停留(仅在阻塞模式下配置时)
还可以支持其他(特定于实现的)选项。
套接字通道可供多个并发线程使用是安全的。它们支持并发读取和写入,尽管在任何给定时间最多一个线程可能正在读取并且最多一个线程可能正在写入。 connect 和 finishConnect 方法彼此相互同步,并且在调用其中一个方法时尝试启动读取或写入操作将被阻止,直到该调用完成。
- 自从:
- 1.4
-
构造方法总结
构造方法 -
方法总结
修饰符和类型方法描述abstract SocketChannelbind(SocketAddress local) 将通道的套接字绑定到本地地址。abstract booleanconnect(SocketAddress remote) 连接此通道的套接字。abstract boolean完成连接套接字通道的过程。abstract SocketAddress返回此通道的套接字绑定到的套接字地址。abstract SocketAddress返回此通道的套接字所连接的远程地址。abstract boolean告知此通道的网络套接字是否已连接。abstract boolean告知此通道上是否正在进行连接操作。static SocketChannelopen()打开一个套接字通道互联网协议socket。static SocketChannelopen(ProtocolFamily family) 打开套接字通道。static SocketChannelopen(SocketAddress remote) 打开套接字通道并将其连接到远程地址。abstract intread(ByteBuffer dst) 从此通道读取一系列字节到给定的缓冲区中。final longread(ByteBuffer[] dsts) 从此通道读取一系列字节到给定的缓冲区中。abstract longread(ByteBuffer[] dsts, int offset, int length) 从此通道读取字节序列到给定缓冲区的子序列中。abstract <T> SocketChannelsetOption(SocketOption<T> name, T value) 设置套接字选项的值。abstract SocketChannel在不关闭通道的情况下关闭读取连接。abstract SocketChannel在不关闭通道的情况下关闭写入连接。abstract Socketsocket()检索与此通道关联的套接字。final intvalidOps()返回标识此通道支持的操作的操作集。abstract intwrite(ByteBuffer src) 将给定缓冲区中的字节序列写入此通道。final longwrite(ByteBuffer[] srcs) 将给定缓冲区中的字节序列写入此通道。abstract longwrite(ByteBuffer[] srcs, int offset, int length) 从给定缓冲区的子序列中将字节序列写入此通道。在类 java.nio.channels.spi.AbstractSelectableChannel 中声明的方法
blockingLock, configureBlocking, implCloseChannel, implCloseSelectableChannel, implConfigureBlocking, isBlocking, isRegistered, keyFor, provider, register在类 java.nio.channels.SelectableChannel 中声明的方法
register在类 java.nio.channels.spi.AbstractInterruptibleChannel 中声明的方法
begin, close, end, isOpen在类 java.lang.Object 中声明的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait在接口 java.nio.channels.NetworkChannel 中声明的方法
getOption, supportedOptions
-
构造方法详细信息
-
SocketChannel
初始化此类的新实例。- 参数:
provider- 创建此通道的提供商
-
-
方法详情
-
open
打开一个套接字通道互联网协议socket。新通道是通过调用系统范围默认
SelectorProvider对象的openSocketChannel方法创建的。- 返回:
- 一个新的套接字通道
- 抛出:
IOException- 如果发生 I/O 错误- 参见:
-
open
打开套接字通道。family参数指定通道套接字的protocol family。新通道是通过调用系统范围默认的
openSocketChannel(ProtocolFamily)方法创建的。SelectorProvider对象。- 参数:
family- 协议族- 返回:
- 一个新的套接字通道
- 抛出:
UnsupportedOperationException- 如果不支持指定的协议系列。例如,假设参数指定为StandardProtocolFamily.INET6但平台上未启用 IPv6。IOException- 如果发生 I/O 错误- 自从:
- 15
- 参见:
-
open
打开套接字通道并将其连接到远程地址。如果远程地址是
InetSocketAddress,则此方法的工作方式就像调用open()方法,在生成的套接字通道上调用connect方法,将其传递给remote,然后返回该通道。如果远程地址是
UnixDomainSocketAddress那么这通过以StandardProtocolFamily.UNIX作为参数调用open(ProtocolFamily)方法,在生成的套接字通道上调用connect方法,传递给它remote,然后返回该通道来工作。- 参数:
remote- 新通道要连接的远程地址- 返回:
- 一个新的、已连接的套接字通道
- 抛出:
AsynchronousCloseException- 如果另一个线程在连接操作正在进行时关闭此通道ClosedByInterruptException- 如果另一个线程在连接操作进行时中断当前线程,从而关闭通道并设置当前线程的中断状态UnresolvedAddressException- 如果给定的远程地址是未完全解析的 InetSocketAddressUnsupportedAddressTypeException- 如果不支持给定远程地址的类型SecurityException- 如果安装了安全管理器并且它不允许访问给定的远程端点IOException- 如果发生其他 I/O 错误- 参见:
-
validOps
public final int validOps()返回标识此通道支持的操作的操作集。套接字通道支持连接、读取和写入,因此此方法返回
(SelectionKey.OP_CONNECT|SelectionKey.OP_READ|SelectionKey.OP_WRITE)。- 指定者:
validOps在类SelectableChannel中- 返回:
- 有效操作集
-
bind
将通道的套接字绑定到本地地址。此方法用于在套接字和本地地址之间建立关联。为了互联网协议套接字,一旦建立关联,套接字将保持绑定状态,直到通道关闭。如果
local参数的值为null,则套接字将绑定到自动分配的地址。- 指定者:
bind在接口NetworkChannel中- API 注意:
-
将套接字通道绑定到Unix域socket 创建一个与
UnixDomainSocketAddress中的文件路径相对应的文件。该文件在通道关闭后仍然存在,并且必须在另一个套接字可以绑定到相同名称之前将其删除。如果到 Unix 域套接字的套接字通道是含蓄地通过连接它而不先调用 bind 来绑定,那么它的套接字是无名,文件系统中没有相应的套接字文件。如果到 Unix 域套接字的套接字通道是自动地通过调用bind(null)绑定,这也会导致未命名的套接字。 - 实现注意事项:
- 每个平台都强制执行特定于实现的名称的最大长度Unix域socket。绑定通道时会强制执行此限制。最大长度通常接近且一般不少于 100 字节。
- 参数:
local- 绑定套接字的地址,或null将套接字绑定到自动分配的套接字地址- 返回:
- 这个通道
- 抛出:
ConnectionPendingException- 如果非阻塞连接操作已经在该通道上进行AlreadyBoundException- 如果套接字已经绑定UnsupportedAddressTypeException- 如果不支持给定地址的类型ClosedChannelException- 如果通道关闭IOException- 如果发生其他 I/O 错误SecurityException- 如果安装了安全管理器并且它的checkListen方法拒绝了一个操作互联网协议套接字地址,或一个Unix域套接字地址,如果它拒绝NetPermission("accessUnixDomainSocket")。- 自从:
- 1.7
- 参见:
-
setOption
从接口NetworkChannel复制的描述设置套接字选项的值。- 指定者:
setOption在接口NetworkChannel中- 类型参数:
T- 套接字选项值的类型- 参数:
name- 套接字选项value- 套接字选项的值。null的值可能是某些套接字选项的有效值。- 返回:
- 这个通道
- 抛出:
UnsupportedOperationException- 如果此通道不支持套接字选项IllegalArgumentException- 如果该值不是此套接字选项的有效值ClosedChannelException- 如果此通道关闭IOException- 如果发生 I/O 错误- 自从:
- 1.7
- 参见:
-
shutdownInput
在不关闭通道的情况下关闭读取连接。一旦关闭以进行读取,然后在通道上进一步读取将返回
-1,即流结束指示。如果连接的输入端已经关闭,则调用此方法无效。- 返回:
- 这个通道
- 抛出:
NotYetConnectedException- 如果此通道尚未连接ClosedChannelException- 如果此通道关闭IOException- 如果发生其他 I/O 错误- 自从:
- 1.7
-
shutdownOutput
在不关闭通道的情况下关闭写入连接。一旦为写入而关闭,然后进一步尝试写入通道将抛出
ClosedChannelException。如果连接的输出端已经关闭,则调用此方法无效。- 返回:
- 这个通道
- 抛出:
NotYetConnectedException- 如果此通道尚未连接ClosedChannelException- 如果此通道关闭IOException- 如果发生其他 I/O 错误- 自从:
- 1.7
-
socket
检索与此通道关联的套接字。- 返回:
- 与此通道关联的套接字
- 抛出:
UnsupportedOperationException- 如果通道的套接字不是互联网协议socket
-
isConnected
public abstract boolean isConnected()告知此通道的网络套接字是否已连接。- 返回:
true当且仅当此通道的网络套接字为open且已连接
-
isConnectionPending
public abstract boolean isConnectionPending()告知此通道上是否正在进行连接操作。- 返回:
true当且仅当连接操作已在此通道上启动但尚未通过调用finishConnect方法完成时
-
connect
连接此通道的套接字。如果此通道处于非阻塞模式,则调用此方法将启动非阻塞连接操作。如果连接立即建立,就像本地连接一样,则此方法返回
true。否则此方法返回false并且稍后必须通过调用finishConnect方法来完成连接操作。如果此通道处于阻塞模式,则此方法的调用将阻塞,直到建立连接或发生 I/O 错误。
对于渠道互联网协议套接字,此方法执行与
Socket类完全相同的安全检查。也就是说,如果已安装安全管理器,则此方法会验证其checkConnect方法是否允许连接到给定远程端点的地址和端口号。对于渠道Unix域套接字,此方法使用安全管理器的
checkPermission方法检查NetPermission("accessUnixDomainSocket")。可以随时调用此方法。如果在调用此方法时调用此通道上的读取或写入操作,则该操作将首先阻塞,直到此调用完成。如果发起连接尝试但失败,即如果调用此方法抛出已检查的异常,则通道将关闭。
- 参数:
remote- 此通道要连接的远程地址- 返回:
true如果连接已建立,false如果此通道处于非阻塞模式并且连接操作正在进行- 抛出:
AlreadyConnectedException- 如果这个通道已经连接ConnectionPendingException- 如果非阻塞连接操作已经在该通道上进行ClosedChannelException- 如果此通道关闭AsynchronousCloseException- 如果另一个线程在连接操作正在进行时关闭此通道ClosedByInterruptException- 如果另一个线程在连接操作进行时中断当前线程,从而关闭通道并设置当前线程的中断状态UnresolvedAddressException- 如果给定的远程地址是未完全解析的 InetSocketAddressUnsupportedAddressTypeException- 如果不支持给定远程地址的类型SecurityException- 如果安装了安全管理器并且它不允许访问给定的远程端点IOException- 如果发生其他 I/O 错误
-
finishConnect
完成连接套接字通道的过程。通过将套接字通道置于非阻塞模式然后调用其
connect方法来启动非阻塞连接操作。一旦建立连接,或者尝试失败,套接字通道将变为可连接,并且可以调用此方法来完成连接序列。如果连接操作失败,则调用此方法将导致抛出适当的IOException。如果此通道已连接,则此方法不会阻塞并会立即返回
true。如果此通道处于非阻塞模式,则此方法将在连接过程尚未完成时返回false。如果此通道处于阻塞模式,则此方法将阻塞直到连接完成或失败,并且将始终返回true或抛出描述失败的已检查异常。可以随时调用此方法。如果在调用此方法时调用此通道上的读取或写入操作,则该操作将首先阻塞,直到此调用完成。如果连接尝试失败,即如果调用此方法抛出已检查的异常,则通道将关闭。
- 返回:
true当且仅当此通道的套接字现在已连接- 抛出:
NoConnectionPendingException- 如果此通道未连接且未启动连接操作ClosedChannelException- 如果此通道关闭AsynchronousCloseException- 如果另一个线程在连接操作正在进行时关闭此通道ClosedByInterruptException- 如果另一个线程在连接操作进行时中断当前线程,从而关闭通道并设置当前线程的中断状态IOException- 如果发生其他 I/O 错误
-
getRemoteAddress
返回此通道的套接字所连接的远程地址。通道的套接字绑定并连接到互联网协议套接字地址,则返回值的类型为
InetSocketAddress。通道的套接字绑定并连接到Unix域套接字地址,返回的地址是一个
UnixDomainSocketAddress。- 返回:
-
远程地址;
null如果通道的套接字未连接 - 抛出:
ClosedChannelException- 如果通道关闭IOException- 如果发生 I/O 错误- 自从:
- 1.7
-
read
从接口ReadableByteChannel复制的描述从此通道读取一系列字节到给定的缓冲区中。尝试读取最多r来自通道的字节,其中r是调用此方法时缓冲区中剩余的字节数,即
dst.remaining()。假设一个字节序列的长度n被读取,其中
0<=n<=r.该字节序列将被传输到缓冲区中,以便序列中的第一个字节位于索引处p最后一个字节在索引处p+n-1,其中p是调用此方法时缓冲区的位置。返回时缓冲区的位置将等于p+n;它的限制不会改变。读取操作可能不会填满缓冲区,实际上它可能根本不会读取任何字节。它是否这样做取决于通道的性质和状态。例如,非阻塞模式下的套接字通道不能读取比套接字输入缓冲区立即可用的字节更多的字节;同样,文件通道读取的字节数不能超过文件中保留的字节数。但是,可以保证,如果通道处于阻塞模式并且缓冲区中至少有一个字节剩余,则此方法将阻塞直到至少读取一个字节。
可以随时调用此方法。但是,如果另一个线程已经在此通道上发起读取操作,则此方法的调用将阻塞,直到第一个操作完成。
- 指定者:
read在接口ReadableByteChannel中- 参数:
dst- 要将字节传输到的缓冲区- 返回:
-
读取的字节数,可能为零,如果通道已到达流末尾,则为
-1 - 抛出:
NotYetConnectedException- 如果此通道尚未连接ClosedChannelException- 如果此通道关闭AsynchronousCloseException- 如果另一个线程在读取操作正在进行时关闭此通道ClosedByInterruptException- 如果另一个线程在读取操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态IOException- 如果发生其他 I/O 错误
-
read
从接口ScatteringByteChannel复制的描述从此通道读取字节序列到给定缓冲区的子序列中。调用此方法会尝试读取最多r来自这个通道的字节,其中r是给定缓冲区数组的指定子序列剩余的字节总数,即,
在调用此方法的那一刻。dsts[offset].remaining() + dsts[offset+1].remaining() + ... + dsts[offset+length-1].remaining()
假设一个字节序列的长度n被读取,其中
0<=n<=r.直到该序列的前dsts[offset].remaining()个字节被传输到缓冲区dsts[offset]中,直到接下来的dsts[offset+1].remaining()个字节被传输到缓冲区dsts[offset+1]中,依此类推,直到整个字节序列被传输到给定的缓冲区中。尽可能多的字节被传输到每个缓冲区,因此每个更新缓冲区的最终位置(最后更新的缓冲区除外)保证等于该缓冲区的限制。可以随时调用此方法。但是,如果另一个线程已经在此通道上发起读取操作,则此方法的调用将阻塞,直到第一个操作完成。
- 指定者:
read在接口ScatteringByteChannel中- 参数:
dsts- 要将字节传输到的缓冲区offset- 字节要传输到的第一个缓冲区的缓冲区数组内的偏移量;必须为非负且不大于dsts.lengthlength- 要访问的最大缓冲区数;必须为非负且不大于dsts.length-offset- 返回:
-
读取的字节数,可能为零,如果通道已到达流末尾,则为
-1 - 抛出:
NotYetConnectedException- 如果此通道尚未连接ClosedChannelException- 如果此通道关闭AsynchronousCloseException- 如果另一个线程在读取操作正在进行时关闭此通道ClosedByInterruptException- 如果另一个线程在读取操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态IOException- 如果发生其他 I/O 错误
-
read
从接口ScatteringByteChannel复制的描述从此通道读取一系列字节到给定的缓冲区中。对
c.read(dsts)形式的方法的调用与调用的行为完全相同c.read(dsts, 0, dsts.length);
- 指定者:
read在接口ScatteringByteChannel中- 参数:
dsts- 要将字节传输到的缓冲区- 返回:
-
读取的字节数,可能为零,如果通道已到达流末尾,则为
-1 - 抛出:
NotYetConnectedException- 如果此通道尚未连接ClosedChannelException- 如果此通道关闭AsynchronousCloseException- 如果另一个线程在读取操作正在进行时关闭此通道ClosedByInterruptException- 如果另一个线程在读取操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态IOException- 如果发生其他 I/O 错误
-
write
从接口WritableByteChannel复制的描述将给定缓冲区中的字节序列写入此通道。试图写到r字节到通道,其中r是调用此方法时缓冲区中剩余的字节数,即
src.remaining()。假设一个字节序列的长度n被写入,其中
0<=n<=r.该字节序列将从索引开始的缓冲区传输p, 在哪里p是调用此方法时缓冲区的位置;写入的最后一个字节的索引将是p+n-1。返回时缓冲区的位置将等于p+n;它的限制不会改变。除非另有说明,否则写操作只有在写完所有内容后才会返回r请求的字节。某些类型的通道,根据它们的状态,可能只写一些字节或者可能根本不写。例如,非阻塞模式下的套接字通道不能写入比套接字输出缓冲区中可用字节更多的字节。
可以随时调用此方法。但是,如果另一个线程已经在该通道上启动了写操作,那么对该方法的调用将阻塞,直到第一个操作完成。
- 指定者:
write在接口WritableByteChannel中- 参数:
src- 要从中检索字节的缓冲区- 返回:
- 写入的字节数,可能为零
- 抛出:
NotYetConnectedException- 如果此通道尚未连接ClosedChannelException- 如果此通道关闭AsynchronousCloseException- 如果另一个线程在写操作正在进行时关闭此通道ClosedByInterruptException- 如果另一个线程在写操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态IOException- 如果发生其他 I/O 错误
-
write
从接口GatheringByteChannel复制的描述从给定缓冲区的子序列中将字节序列写入此通道。试图写到r字节到这个通道,其中r是给定缓冲区数组的指定子序列中剩余的字节总数,即
在调用此方法的那一刻。srcs[offset].remaining() + srcs[offset+1].remaining() + ... + srcs[offset+length-1].remaining()
假设一个字节序列的长度n被写入,其中
0<=n<=r.该序列的前srcs[offset].remaining()个字节从缓冲区srcs[offset]写入,接下来的srcs[offset+1].remaining()个字节从缓冲区srcs[offset+1]写入,依此类推,直到写入整个字节序列。从每个缓冲区写入尽可能多的字节,因此每个更新缓冲区的最终位置(最后更新的缓冲区除外)保证等于该缓冲区的限制。除非另有说明,否则写操作只有在写完所有内容后才会返回r请求的字节。某些类型的通道,根据它们的状态,可能只写一些字节或者可能根本不写。例如,非阻塞模式下的套接字通道不能写入比套接字输出缓冲区中可用字节更多的字节。
可以随时调用此方法。但是,如果另一个线程已经在该通道上启动了写操作,那么对该方法的调用将阻塞,直到第一个操作完成。
- 指定者:
write在接口GatheringByteChannel中- 参数:
srcs- 要从中检索字节的缓冲区offset- 要从中检索字节的第一个缓冲区的缓冲区数组内的偏移量;必须为非负且不大于srcs.lengthlength- 要访问的最大缓冲区数;必须为非负且不大于srcs.length-offset- 返回:
- 写入的字节数,可能为零
- 抛出:
NotYetConnectedException- 如果此通道尚未连接ClosedChannelException- 如果此通道关闭AsynchronousCloseException- 如果另一个线程在写操作正在进行时关闭此通道ClosedByInterruptException- 如果另一个线程在写操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态IOException- 如果发生其他 I/O 错误
-
write
从接口GatheringByteChannel复制的描述将给定缓冲区中的字节序列写入此通道。对
c.write(srcs)形式的方法的调用与调用的行为完全相同c.write(srcs, 0, srcs.length);
- 指定者:
write在接口GatheringByteChannel中- 参数:
srcs- 要从中检索字节的缓冲区- 返回:
- 写入的字节数,可能为零
- 抛出:
NotYetConnectedException- 如果此通道尚未连接ClosedChannelException- 如果此通道关闭AsynchronousCloseException- 如果另一个线程在写操作正在进行时关闭此通道ClosedByInterruptException- 如果另一个线程在写操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态IOException- 如果发生其他 I/O 错误
-
getLocalAddress
返回此通道的套接字绑定到的套接字地址。如果通道是
bound到 Internet 协议套接字地址,则此方法的返回值是InetSocketAddress类型。如果设置了安全管理器,则以本地地址和-1作为参数调用其checkConnect方法,以查看是否允许该操作。如果不允许该操作,则返回表示loopback地址和通道套接字的本地端口的SocketAddress。其中通道绑定到 Unix 域套接字地址,套接字地址是
UnixDomainSocketAddress。如果设置了安全管理器,则使用NetPermission("accessUnixDomainSocket")调用其checkPermission方法。如果不允许该操作,则返回未命名的UnixDomainSocketAddress。- 指定者:
getLocalAddress在接口NetworkChannel中- 返回:
-
套接字绑定到的
SocketAddress,或者如果被安全管理器拒绝则代表环回地址或空路径的SocketAddress,或者如果通道的套接字未绑定则为null - 抛出:
ClosedChannelException- 如果通道关闭IOException- 如果发生 I/O 错误
-