- 所有已实现的接口:
Closeable,AutoCloseable,AsynchronousByteChannel,AsynchronousChannel,Channel,NetworkChannel
异步套接字通道以两种方式之一创建。通过调用此类定义的 open 方法之一创建新创建的 AsynchronousSocketChannel。新创建的通道已打开但尚未连接。当连接到 AsynchronousServerSocketChannel 的套接字时,将创建连接的 AsynchronousSocketChannel。不可能为任意的、预先存在的 socket 创建异步套接字通道。
通过调用其 connect 方法连接新创建的通道;一旦连接,通道将保持连接状态直到关闭。套接字通道是否已连接可通过调用其getRemoteAddress 方法来确定。尝试在未连接的通道上调用 I/O 操作将导致抛出 NotYetConnectedException 。
这种类型的通道可以安全地供多个并发线程使用。它们支持并发读写,但任何时候最多只能有一个读操作和一个写操作。如果线程在前一个读取操作完成之前启动读取操作,则会抛出 ReadPendingException 。类似地,在先前的写入完成之前尝试启动写入操作将抛出 WritePendingException 。
使用 setOption 方法配置套接字选项。异步套接字通道支持以下选项:
还可以支持其他(特定于实现的)选项。
选项名称 Description SO_SNDBUF套接字发送缓冲区的大小 SO_RCVBUF套接字接收缓冲区的大小 SO_KEEPALIVE保持连接 SO_REUSEADDR重复使用地址 TCP_NODELAY禁用 Nagle 算法
超时
此类定义的 read 和 write 方法允许在启动读取或写入操作时指定超时。如果超时在操作完成之前结束,则操作完成,但出现异常 InterruptedByTimeoutException 。超时可能会使通道或底层连接处于不一致状态。如果实现不能保证没有从通道中读取字节,那么它会将通道放入特定于实现的 error state 中。随后尝试启动 read 操作会导致抛出未指定的运行时异常。同样,如果 write 操作超时并且实现无法保证字节未写入通道,则进一步尝试 write 到通道会导致抛出未指定的运行时异常。当超时结束时,ByteBuffer 的状态或缓冲区序列未定义用于 I/O 操作。缓冲区应该被丢弃,或者至少必须小心以确保在通道保持打开时缓冲区不被访问。所有接受超时参数的方法都将小于或等于零的值视为 I/O 操作不会超时。
- 自从:
- 1.7
-
构造方法总结
构造方法 -
方法总结
修饰符和类型方法描述abstract AsynchronousSocketChannelbind(SocketAddress local) 将通道的套接字绑定到本地地址。connect(SocketAddress remote) 连接此通道。abstract <A> voidconnect(SocketAddress remote, A attachment, CompletionHandler<Void, ? super A> handler) 连接此通道。abstract SocketAddress返回此通道的套接字绑定到的套接字地址。abstract SocketAddress返回此通道的套接字所连接的远程地址。static AsynchronousSocketChannelopen()打开异步套接字通道。static AsynchronousSocketChannelopen(AsynchronousChannelGroup group) 打开异步套接字通道。provider()返回创建此通道的提供者。read(ByteBuffer dst) 从此通道读取一系列字节到给定的缓冲区中。abstract <A> voidread(ByteBuffer[] dsts, int offset, int length, long timeout, TimeUnit unit, A attachment, CompletionHandler<Long, ? super A> handler) 从此通道读取字节序列到给定缓冲区的子序列中。abstract <A> voidread(ByteBuffer dst, long timeout, TimeUnit unit, A attachment, CompletionHandler<Integer, ? super A> handler) 从此通道读取一系列字节到给定的缓冲区中。final <A> voidread(ByteBuffer dst, A attachment, CompletionHandler<Integer, ? super A> handler) 从此通道读取一系列字节到给定的缓冲区中。abstract <T> AsynchronousSocketChannelsetOption(SocketOption<T> name, T value) 设置套接字选项的值。abstract AsynchronousSocketChannel在不关闭通道的情况下关闭读取连接。abstract AsynchronousSocketChannel在不关闭通道的情况下关闭写入连接。write(ByteBuffer src) 将给定缓冲区中的字节序列写入此通道。abstract <A> voidwrite(ByteBuffer[] srcs, int offset, int length, long timeout, TimeUnit unit, A attachment, CompletionHandler<Long, ? super A> handler) 从给定缓冲区的子序列中将字节序列写入此通道。abstract <A> voidwrite(ByteBuffer src, long timeout, TimeUnit unit, A attachment, CompletionHandler<Integer, ? super A> handler) 将给定缓冲区中的字节序列写入此通道。final <A> voidwrite(ByteBuffer src, A attachment, CompletionHandler<Integer, ? super A> handler) 将给定缓冲区中的字节序列写入此通道。在类 java.lang.Object 中声明的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait在接口 java.nio.channels.AsynchronousChannel 中声明的方法
close在接口 java.nio.channels.NetworkChannel 中声明的方法
getOption, supportedOptions
-
构造方法详细信息
-
AsynchronousSocketChannel
初始化此类的新实例。- 参数:
provider- 创建此通道的提供商
-
-
方法详情
-
provider
返回创建此通道的提供者。- 返回:
- 创建此通道的提供商
-
open
打开异步套接字通道。新通道是通过调用创建组的
AsynchronousChannelProvider上的openAsynchronousSocketChannel方法创建的。如果组参数为null,则生成的通道由系统范围的默认提供程序创建,并绑定到 default group。- 参数:
group- 新建通道应绑定到的组,或null用于默认组- 返回:
- 一个新的异步套接字通道
- 抛出:
ShutdownChannelGroupException- 如果通道组关闭IOException- 如果发生 I/O 错误
-
open
打开异步套接字通道。此方法返回绑定到 default group 的异步套接字通道。此方法等效于计算表达式:
open((AsynchronousChannelGroup)null);
- 返回:
- 一个新的异步套接字通道
- 抛出:
IOException- 如果发生 I/O 错误
-
bind
从接口NetworkChannel复制的描述将通道的套接字绑定到本地地址。此方法用于在套接字和本地地址之间建立关联。一旦建立关联,套接字将保持绑定状态,直到通道关闭。如果
local参数的值为null,则套接字将绑定到自动分配的地址。- 指定者:
bind在接口NetworkChannel中- 参数:
local- 绑定套接字的地址,或null将套接字绑定到自动分配的套接字地址- 返回:
- 这个通道
- 抛出:
ConnectionPendingException- 如果连接操作已经在这个通道上进行AlreadyBoundException- 如果套接字已经绑定UnsupportedAddressTypeException- 如果不支持给定地址的类型ClosedChannelException- 如果通道关闭IOException- 如果发生其他 I/O 错误SecurityException- 如果安装了安全管理器并且其checkListen方法拒绝操作- 参见:
-
setOption
public abstract <T> AsynchronousSocketChannel setOption(SocketOption <T> name, T value) throws IOException 从接口NetworkChannel复制的描述设置套接字选项的值。- 指定者:
setOption在接口NetworkChannel中- 类型参数:
T- 套接字选项值的类型- 参数:
name- 套接字选项value- 套接字选项的值。null的值可能是某些套接字选项的有效值。- 返回:
- 这个通道
- 抛出:
IllegalArgumentException- 如果该值不是此套接字选项的有效值ClosedChannelException- 如果此通道关闭IOException- 如果发生 I/O 错误- 参见:
-
shutdownInput
在不关闭通道的情况下关闭读取连接。一旦关闭以进行读取,然后在通道上进一步读取将返回
-1,即流结束指示。如果连接的输入端已经关闭,则调用此方法无效。对未完成的读取操作的影响取决于系统,因此未指定。当套接字接收缓冲区中有数据未被读取或数据随后到达时的影响(如果有的话)也取决于系统。- 返回:
- 这个通道
- 抛出:
NotYetConnectedException- 如果此通道尚未连接ClosedChannelException- 如果此通道关闭IOException- 如果发生其他 I/O 错误
-
shutdownOutput
在不关闭通道的情况下关闭写入连接。一旦为写入而关闭,然后进一步尝试写入通道将抛出
ClosedChannelException。如果连接的输出端已经关闭,则调用此方法无效。对未完成的写操作的影响取决于系统,因此未指定。- 返回:
- 这个通道
- 抛出:
NotYetConnectedException- 如果此通道尚未连接ClosedChannelException- 如果此通道关闭IOException- 如果发生其他 I/O 错误
-
getRemoteAddress
返回此通道的套接字所连接的远程地址。如果通道绑定并连接到 Internet 协议套接字地址,则此方法的返回值是
InetSocketAddress类型。- 返回:
-
远程地址;
null如果通道的套接字未连接 - 抛出:
ClosedChannelException- 如果通道关闭IOException- 如果发生 I/O 错误
-
connect
public abstract <A> void connect(SocketAddress remote, A attachment, CompletionHandler <Void , ? super A> handler) 连接此通道。此方法启动连接此通道的操作。
handler参数是一个完成处理程序,当连接成功建立或连接无法建立时调用。如果无法建立连接,则关闭通道。此方法执行与
Socket类完全相同的安全检查。也就是说,如果已安装安全管理器,则此方法会验证其checkConnect方法是否允许连接到给定远程端点的地址和端口号。- 类型参数:
A- 附件类型- 参数:
remote- 此通道要连接的远程地址attachment- 附加到 I/O 操作的对象;可以是nullhandler- 使用结果的处理程序- 抛出:
UnresolvedAddressException- 如果给定的远程地址没有完全解析UnsupportedAddressTypeException- 如果不支持给定远程地址的类型AlreadyConnectedException- 如果这个通道已经连接ConnectionPendingException- 如果连接操作已经在这个通道上进行ShutdownChannelGroupException- 如果通道组已终止SecurityException- 如果安装了安全管理器并且它不允许访问给定的远程端点- 参见:
-
connect
连接此通道。此方法启动连接此通道的操作。此方法的行为方式与
connect(SocketAddress, Object, CompletionHandler)方法完全相同,不同之处在于此方法不指定完成处理程序,而是返回表示待处理结果的Future。Future的get方法在成功完成时返回null。- 参数:
remote- 此通道要连接的远程地址- 返回:
-
代表未决结果的
Future对象 - 抛出:
UnresolvedAddressException- 如果给定的远程地址没有完全解析UnsupportedAddressTypeException- 如果不支持给定远程地址的类型AlreadyConnectedException- 如果这个通道已经连接ConnectionPendingException- 如果连接操作已经在这个通道上进行SecurityException- 如果安装了安全管理器并且它不允许访问给定的远程端点
-
read
public abstract <A> void read(ByteBuffer dst, long timeout, TimeUnit unit, A attachment, CompletionHandler <Integer , ? super A> handler) 从此通道读取一系列字节到给定的缓冲区中。此方法启动异步读取操作,以将字节序列从此通道读取到给定缓冲区中。
handler参数是一个完成处理程序,在读取操作完成(或失败)时调用。传递给完成处理程序的结果是读取的字节数或-1如果由于通道已到达流结尾而无法读取任何字节。如果指定了超时并且在操作完成之前超时已经过去,则操作将完成并出现异常
InterruptedByTimeoutException。如果发生超时,并且实现不能保证字节未被读取,或者不会从通道读取到给定缓冲区,则进一步尝试从通道读取将导致抛出不特定的运行时异常。否则此方法的工作方式与
AsynchronousByteChannel.read(ByteBuffer,Object,CompletionHandler)方法相同。- 类型参数:
A- 附件类型- 参数:
dst- 要将字节传输到的缓冲区timeout- I/O 操作完成的最长时间unit-timeout参数的时间单位attachment- 附加到 I/O 操作的对象;可以是nullhandler- 使用结果的处理程序- 抛出:
IllegalArgumentException- 如果缓冲区是只读的ReadPendingException- 如果读操作已经在这个通道上进行NotYetConnectedException- 如果此通道尚未连接ShutdownChannelGroupException- 如果通道组已终止
-
read
public final <A> void read(ByteBuffer dst, A attachment, CompletionHandler <Integer , ? super A> handler) 从接口AsynchronousByteChannel复制的描述从此通道读取一系列字节到给定的缓冲区中。此方法启动异步读取操作,以将字节序列从此通道读取到给定缓冲区中。
handler参数是一个完成处理程序,在读取操作完成(或失败)时调用。传递给完成处理程序的结果是读取的字节数或-1如果由于通道已到达流结尾而无法读取任何字节。读取操作最多可以读取r来自通道的字节,其中r是缓冲区中剩余的字节数,即尝试读取时的
dst.remaining()。在哪里r为 0,读取操作立即完成,结果为0,无需启动 I/O 操作。假设一个字节序列的长度n被读取,其中
0<n<=r.该字节序列将被传输到缓冲区中,以便序列中的第一个字节位于索引处p最后一个字节在索引处p+n-1,其中p是执行读取时缓冲区的位置。完成后缓冲区的位置将等于p+n;它的限制不会改变。多个并发线程使用缓冲区是不安全的,因此应注意在操作完成之前不要访问缓冲区。
可以随时调用此方法。某些通道类型可能不允许在任何给定时间有多个读取未完成。如果线程在前一个读取操作完成之前启动读取操作,则会抛出
ReadPendingException。- 指定者:
read在接口AsynchronousByteChannel中- 类型参数:
A- 附件类型- 参数:
dst- 要将字节传输到的缓冲区attachment- 附加到 I/O 操作的对象;可以是nullhandler- 完成处理程序- 抛出:
IllegalArgumentException- 如果缓冲区是只读的ReadPendingException- 如果通道不允许超过一个读取未完成且前一个读取尚未完成NotYetConnectedException- 如果此通道尚未连接ShutdownChannelGroupException- 如果通道组已终止
-
read
从接口AsynchronousByteChannel复制的描述从此通道读取一系列字节到给定的缓冲区中。此方法启动异步读取操作,以将字节序列从此通道读取到给定缓冲区中。该方法的行为方式与
read(ByteBuffer,Object,CompletionHandler)方法完全相同,只是该方法不指定完成处理程序,而是返回一个Future表示未决结果。Future的get方法返回读取的字节数或-1如果因为通道已到达流结尾而无法读取任何字节。- 指定者:
read在接口AsynchronousByteChannel中- 参数:
dst- 要将字节传输到的缓冲区- 返回:
- 代表操作结果的 Future
- 抛出:
IllegalArgumentException- 如果缓冲区是只读的ReadPendingException- 如果通道不允许超过一个读取未完成且前一个读取尚未完成NotYetConnectedException- 如果此通道尚未连接
-
read
public abstract <A> void read(ByteBuffer [] dsts, int offset, int length, long timeout, TimeUnit unit, A attachment, CompletionHandler <Long , ? super A> handler) 从此通道读取字节序列到给定缓冲区的子序列中。此操作有时称为 scattering read ,在实现将数据分组为由一个或多个固定长度标头和后跟可变长度主体组成的段的网络协议时通常很有用。handler参数是一个完成处理程序,在读取操作完成(或失败)时调用。传递给完成处理程序的结果是读取的字节数或-1如果由于通道已到达流结尾而无法读取任何字节。此方法启动读取最多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]中,依此类推,直到整个字节序列被传输到给定的缓冲区中。尽可能多的字节被传输到每个缓冲区,因此每个更新缓冲区的最终位置(最后更新的缓冲区除外)保证等于该缓冲区的限制。底层操作系统可能会对可用于 I/O 操作的缓冲区数量施加限制。如果缓冲区数(剩余字节数)超过此限制,则使用操作系统允许的最大缓冲区数执行 I/O 操作。如果指定了超时并且在操作完成之前超时已经过去,则它会完成并出现异常
InterruptedByTimeoutException。如果发生超时,并且实现不能保证字节未被读取,或者不会从通道读取到给定缓冲区,则进一步尝试从通道读取将导致抛出非特定的运行时异常。- 类型参数:
A- 附件类型- 参数:
dsts- 要将字节传输到的缓冲区offset- 字节要传输到的第一个缓冲区的缓冲区数组内的偏移量;必须为非负且不大于dsts.lengthlength- 要访问的最大缓冲区数;必须为非负且不大于dsts.length - offsettimeout- I/O 操作完成的最长时间unit-timeout参数的时间单位attachment- 附加到 I/O 操作的对象;可以是nullhandler- 使用结果的处理程序- 抛出:
IndexOutOfBoundsException- 如果不满足offset和length参数的先决条件IllegalArgumentException- 如果缓冲区是只读的ReadPendingException- 如果读操作已经在这个通道上进行NotYetConnectedException- 如果此通道尚未连接ShutdownChannelGroupException- 如果通道组已终止
-
write
public abstract <A> void write(ByteBuffer src, long timeout, TimeUnit unit, A attachment, CompletionHandler <Integer , ? super A> handler) 将给定缓冲区中的字节序列写入此通道。此方法启动异步写入操作,以将字节序列从给定缓冲区写入此通道。
handler参数是一个完成处理程序,在写入操作完成(或失败)时调用。传递给完成处理程序的结果是写入的字节数。如果指定了超时并且在操作完成之前超时已经过去,则它会完成并出现异常
InterruptedByTimeoutException。如果发生超时,并且实现不能保证字节没有被写入,或者不会从给定缓冲区写入通道,则进一步尝试写入通道将导致抛出非特定的运行时异常。否则此方法的工作方式与
AsynchronousByteChannel.write(ByteBuffer,Object,CompletionHandler)方法相同。- 类型参数:
A- 附件类型- 参数:
src- 要从中检索字节的缓冲区timeout- I/O 操作完成的最长时间unit-timeout参数的时间单位attachment- 附加到 I/O 操作的对象;可以是nullhandler- 使用结果的处理程序- 抛出:
WritePendingException- 如果写操作已经在这个通道上进行NotYetConnectedException- 如果此通道尚未连接ShutdownChannelGroupException- 如果通道组已终止
-
write
public final <A> void write(ByteBuffer src, A attachment, CompletionHandler <Integer , ? super A> handler) 从接口AsynchronousByteChannel复制的描述将给定缓冲区中的字节序列写入此通道。此方法启动异步写入操作,以将字节序列从给定缓冲区写入此通道。
handler参数是一个完成处理程序,在写入操作完成(或失败)时调用。传递给完成处理程序的结果是写入的字节数。写操作最多可以写r字节到通道,其中r是缓冲区中剩余的字节数,即尝试写入时的
src.remaining()。在哪里r为 0,写入操作立即完成,结果为0,无需启动 I/O 操作。假设一个字节序列的长度n被写入,其中
0<n<=r.该字节序列将从索引开始的缓冲区传输p, 在哪里p是执行写入时缓冲区的位置;写入的最后一个字节的索引将是p+n-1。完成后缓冲区的位置将等于p+n;它的限制不会改变。多个并发线程使用缓冲区是不安全的,因此应注意在操作完成之前不要访问缓冲区。
可以随时调用此方法。某些通道类型可能不允许在任何给定时间有多个未完成的写入。如果线程在前一个写操作完成之前启动写操作,则将抛出
WritePendingException。- 指定者:
write在接口AsynchronousByteChannel中- 类型参数:
A- 附件类型- 参数:
src- 要从中检索字节的缓冲区attachment- 附加到 I/O 操作的对象;可以是nullhandler- 完成处理程序对象- 抛出:
WritePendingException- 如果通道不允许超过一个写入未完成且前一个写入尚未完成NotYetConnectedException- 如果此通道尚未连接ShutdownChannelGroupException- 如果通道组已终止
-
write
从接口AsynchronousByteChannel复制的描述将给定缓冲区中的字节序列写入此通道。此方法启动异步写入操作,以将字节序列从给定缓冲区写入此通道。该方法的行为方式与
write(ByteBuffer,Object,CompletionHandler)方法完全相同,不同之处在于该方法不指定完成处理程序,而是返回一个Future表示未决结果。Future的get方法返回写入的字节数。- 指定者:
write在接口AsynchronousByteChannel中- 参数:
src- 要从中检索字节的缓冲区- 返回:
- 代表操作结果的 Future
- 抛出:
WritePendingException- 如果通道不允许超过一个写入未完成且前一个写入尚未完成NotYetConnectedException- 如果此通道尚未连接
-
write
public abstract <A> void write(ByteBuffer [] srcs, int offset, int length, long timeout, TimeUnit unit, A attachment, CompletionHandler <Long , ? super A> handler) 从给定缓冲区的子序列中将字节序列写入此通道。此操作有时称为 gathering write ,在实现将数据分组为由一个或多个固定长度标头和后跟可变长度主体组成的段的网络协议时通常很有用。handler参数是一个完成处理程序,在写入操作完成(或失败)时调用。传递给完成处理程序的结果是写入的字节数。此方法启动最多写入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]写入,依此类推,直到写入整个字节序列。从每个缓冲区写入尽可能多的字节,因此每个更新缓冲区的最终位置(最后更新的缓冲区除外)保证等于该缓冲区的限制。底层操作系统可能会对可用于 I/O 操作的缓冲区数量施加限制。如果缓冲区数(剩余字节数)超过此限制,则使用操作系统允许的最大缓冲区数执行 I/O 操作。如果指定了超时并且在操作完成之前超时已经过去,则它会完成并出现异常
InterruptedByTimeoutException。如果发生超时,并且实现不能保证字节没有被写入,或者不会从给定的缓冲区写入通道,则进一步尝试写入通道将导致抛出非特定的运行时异常。- 类型参数:
A- 附件类型- 参数:
srcs- 要从中检索字节的缓冲区offset- 要从中检索字节的第一个缓冲区的缓冲区数组内的偏移量;必须为非负且不大于srcs.lengthlength- 要访问的最大缓冲区数;必须为非负且不大于srcs.length - offsettimeout- I/O 操作完成的最长时间unit-timeout参数的时间单位attachment- 附加到 I/O 操作的对象;可以是nullhandler- 使用结果的处理程序- 抛出:
IndexOutOfBoundsException- 如果不满足offset和length参数的先决条件WritePendingException- 如果写操作已经在这个通道上进行NotYetConnectedException- 如果此通道尚未连接ShutdownChannelGroupException- 如果通道组已终止
-
getLocalAddress
返回此通道的套接字绑定到的套接字地址。如果通道是
bound到 Internet 协议套接字地址,则此方法的返回值是InetSocketAddress类型。如果设置了安全管理器,则以本地地址和
-1作为参数调用其checkConnect方法,以查看是否允许该操作。如果不允许该操作,则返回表示loopback地址和通道套接字的本地端口的SocketAddress。- 指定者:
getLocalAddress在接口NetworkChannel中- 返回:
-
套接字绑定到的
SocketAddress,或者如果被安全管理器拒绝则代表环回地址的SocketAddress,或者如果通道的套接字未绑定则为null - 抛出:
ClosedChannelException- 如果通道关闭IOException- 如果发生 I/O 错误
-