public abstract class AsynchronousSocketChannel extends Object implements AsynchronousByteChannel, NetworkChannel
异步套接字通道是两种方式中的一种。新创建的AsynchronousSocketChannel
通过调用这个类的一个定义的open
方法创建。一个新创建的通道是打开的,但尚未连接。连接AsynchronousSocketChannel
时创建一个连接到一个AsynchronousServerSocketChannel
插座。这是不可能创造一个任意一个异步套接字通道,预先存在的socket
。
新创建的通道是通过调用其connect
方法连接;一旦连接,通道保持连接直到它关闭。是否一个套接字通道连接可以通过调用其getRemoteAddress
法测定。试图调用一个I/O操作在一个连接的通道会被NotYetConnectedException
。
这种类型的信道是安全的,用于多个并发线程。他们支持并发读和写,虽然在大多数一个读操作和一个写操作可以在任何时间突出。如果一个线程启动一个读操作之前的读操作之前完成然后ReadPendingException
将抛出。同样,试图发起一个写操作之前以前写已完成将WritePendingException
。
套接字选项的配置使用setOption
方法。异步套接字通道支持以下选项:
附加(具体实施)选项也可以支持。
Option Name 描述 SO_SNDBUF
The size of the socket send buffer SO_RCVBUF
The size of the socket receive buffer SO_KEEPALIVE
Keep connection alive SO_REUSEADDR
Re-use address TCP_NODELAY
Disable the Nagle algorithm
的read
和write
方法采用这类定义允许超时被指定当启动一个读或写操作。如果超时之前经过一个操作完成,然后操作完成除InterruptedByTimeoutException
。超时可能离开通道,或潜在的联系,在一个不一致的状态。执行不能保证在没有从信道读取的字节数,然后它把信道到一个实现特定的错误状态。随后尝试启动一个read
操作原因不明的异常被抛出。同样,如果一个write
操作次数和实施不能保证字节没有被写入通道进一步尝试write
信道的原因不明的异常被抛出。当一个超时的流逝然后ByteBuffer
状态,或缓冲区的序列,用于I/O操作没有定义。缓冲区应该被丢弃或至少必须小心,以确保缓冲区不被访问,而通道保持开放。接受超时参数的所有方法处理值小于或等于零,这意味着I / O操作不超时。
Modifier | Constructor and Description |
---|---|
protected |
AsynchronousSocketChannel(AsynchronousChannelProvider provider)
初始化该类的一个新实例。
|
Modifier and Type | Method and Description |
---|---|
abstract AsynchronousSocketChannel |
bind(SocketAddress local)
将信道的套接字绑定到本地地址。
|
abstract Future<Void> |
connect(SocketAddress remote)
连接此通道。
|
abstract <A> void |
connect(SocketAddress remote, A attachment, CompletionHandler<Void,? super A> handler)
连接此通道。
|
abstract SocketAddress |
getLocalAddress()
返回此通道的套接字绑定到的套接字地址。
|
abstract SocketAddress |
getRemoteAddress()
返回此通道的套接字连接的远程地址。
|
static AsynchronousSocketChannel |
open()
打开一个异步套接字通道。
|
static AsynchronousSocketChannel |
open(AsynchronousChannelGroup group)
打开一个异步套接字通道。
|
AsynchronousChannelProvider |
provider()
返回创建此通道的提供程序。
|
abstract Future<Integer> |
read(ByteBuffer dst)
从这个通道读取一个字节序列到给定的缓冲区中。
|
abstract <A> void |
read(ByteBuffer[] dsts, int offset, int length, long timeout, TimeUnit unit, A attachment, CompletionHandler<Long,? super A> handler)
读这信入子序列给定的缓冲区字节序列。
|
<A> void |
read(ByteBuffer dst, A attachment, CompletionHandler<Integer,? super A> handler)
从这个通道读取一个字节序列到给定的缓冲区中。
|
abstract <A> void |
read(ByteBuffer dst, long timeout, TimeUnit unit, A attachment, CompletionHandler<Integer,? super A> handler)
从这个通道读取一个字节序列到给定的缓冲区中。
|
abstract <T> AsynchronousSocketChannel |
setOption(SocketOption<T> name, T value)
设置套接字选项的值。
|
abstract AsynchronousSocketChannel |
shutdownInput()
关闭不关闭通道的连接。
|
abstract AsynchronousSocketChannel |
shutdownOutput()
关闭不关闭通道的连接。
|
abstract Future<Integer> |
write(ByteBuffer src)
从给定的缓冲区中写入该通道的一个字节序列。
|
abstract <A> void |
write(ByteBuffer[] srcs, int offset, int length, long timeout, TimeUnit unit, A attachment, CompletionHandler<Long,? super A> handler)
写一个字节序列的子序列对该通道从给定的缓冲区。
|
<A> void |
write(ByteBuffer src, A attachment, CompletionHandler<Integer,? super A> handler)
从给定的缓冲区中写入该通道的一个字节序列。
|
abstract <A> void |
write(ByteBuffer src, long timeout, TimeUnit unit, A attachment, CompletionHandler<Integer,? super A> handler)
从给定的缓冲区中写入该通道的一个字节序列。
|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
close
getOption, supportedOptions
protected AsynchronousSocketChannel(AsynchronousChannelProvider provider)
provider
-供应商,创造了这个频道
public final AsynchronousChannelProvider provider()
public static AsynchronousSocketChannel open(AsynchronousChannelGroup group) throws IOException
新的渠道是通过调用创建组AsynchronousChannelProvider
的openAsynchronousSocketChannel
方法创建。如果该组参数null
然后得到的通道是由系统默认提供程序创建,并绑定到默认组。
group
-集团的新建通道应绑定,或
null
为默认组
ShutdownChannelGroupException
如果通道组关机
IOException
如果I/O错误发生
public static AsynchronousSocketChannel open() throws IOException
此方法返回绑定到默认组的异步套接字通道。此方法相当于对表达式进行评估:
open((AsynchronousChannelGroup)null);
IOException
如果I/O错误发生
public abstract AsynchronousSocketChannel bind(SocketAddress local) throws IOException
NetworkChannel
此方法用于建立套接字和本地地址之间的关联。一旦一个关联建立,那么套接字保持绑定,直到通道关闭。如果local
参数的值null
然后插座将绑定到一个地址的自动分配。
bind
接口
NetworkChannel
local
-地址绑定套接字,或者
null
绑定socket套接字地址的自动分配
ConnectionPendingException
-如果一个连接操作已在进行中在这个频道
AlreadyBoundException
如果插座已绑定
UnsupportedAddressTypeException
如果给定的地址的类型不支持
ClosedChannelException
如果通道关闭
IOException
-如果其他I/O错误发生
SecurityException
-如果一个安全管理已安装的
checkListen
否认操作方法
NetworkChannel.getLocalAddress()
public abstract <T> AsynchronousSocketChannel setOption(SocketOption<T> name, T value) throws IOException
NetworkChannel
setOption
接口
NetworkChannel
T
的套接字选项的值的类型
name
的套接字选项
value
-套接字选项的值。一个价值
null
可能对于一些套接字选项的有效值。
IllegalArgumentException
-如果值不是此套接字选项的有效值
ClosedChannelException
-如果这通道关闭
IOException
如果I/O错误发生
StandardSocketOptions
public abstract AsynchronousSocketChannel shutdownInput() throws IOException
一旦停止阅读然后再读取通道将返回-1
,流指示结束。如果连接的输入端已经关闭,则调用该方法没有效果。一个优秀的读操作的效果是系统依赖,因此没有指定。的效果,如果有的话,当有数据在套接字接收缓冲区,并没有被读取,或数据到达随后,也依赖于系统。
NotYetConnectedException
-如果这个通道没有连接
ClosedChannelException
-如果这通道关闭
IOException
-如果其他I/O错误发生
public abstract AsynchronousSocketChannel shutdownOutput() throws IOException
一旦关机写作进而试图写入通道将把ClosedChannelException
。如果连接的输出端已经关闭,则调用该方法没有效果。一个出色的写操作的效果是系统依赖,因此没有指定。
NotYetConnectedException
-如果这个通道没有连接
ClosedChannelException
-如果这通道关闭
IOException
-如果其他I/O错误发生
public abstract SocketAddress getRemoteAddress() throws IOException
在信道绑定和连接到一个网络协议的套接字地址然后从这个方法返回值的类型是InetSocketAddress
。
null
如果信道的套接字没有连接
ClosedChannelException
如果通道关闭
IOException
如果I/O错误发生
public abstract <A> void connect(SocketAddress remote, A attachment, CompletionHandler<Void,? super A> handler)
此方法启动一个连接此通道的操作。的handler
参数完成处理被调用,当连接成功建立或无法建立连接。如果无法建立连接,则关闭通道。
该方法具有完全相同的安全检查,为Socket
类。那就是,如果一个安全管理已安装此方法验证其checkConnect
方法允许连接的地址和端口号指定远程端点。
A
-附件的类型
remote
-远程地址,这个通道是连接
attachment
-连接到I/O操作的对象;可以
null
handler
-消费结果的处理程序
UnresolvedAddressException
-如果给定的地址是不能完全解决
UnsupportedAddressTypeException
如果给定的远程地址的类型不支持
AlreadyConnectedException
-如果这个通道已经连接
ConnectionPendingException
-如果一个连接操作已在进行中在这个频道
ShutdownChannelGroupException
如果通道组已终止
SecurityException
如果安全管理器已经安装,它不允许访问特定的远程端点
getRemoteAddress()
public abstract Future<Void> connect(SocketAddress remote)
此方法启动一个连接此通道的操作。此方法的行为以同样的方式不是指定的connect(SocketAddress, Object, CompletionHandler)
完成处理程序的方法,该方法返回一个Future
表示等待结果。的Future
的get
方法返回成功完成null
。
remote
-远程地址,这个通道是连接
Future
对象
UnresolvedAddressException
-如果给定的地址是不能完全解决
UnsupportedAddressTypeException
如果给定的远程地址的类型不支持
AlreadyConnectedException
-如果这个通道已经连接
ConnectionPendingException
-如果一个连接操作已在进行中在这个频道
SecurityException
如果安全管理器已经安装,它不允许访问特定的远程端点
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操作的对象;可以
null
handler
-消费结果的处理程序
IllegalArgumentException
-如果缓冲区是只读的
ReadPendingException
-如果一个读操作已在进行中在这个频道
NotYetConnectedException
-如果这个通道没有连接
ShutdownChannelGroupException
如果通道组已终止
public final <A> void read(ByteBuffer dst, A attachment, CompletionHandler<Integer,? super A> handler)
AsynchronousByteChannel
此方法启动一个异步读操作,从这个通道读取一个字节的序列到给定的缓冲区中。的handler
参数完成处理程序被调用的读操作完成时(或失败)。结果通过完成处理程序读取的字节或字节-1
如果不可以因为信已经达到结束流数。
读操作可以读到R字节从通道,其中R为剩余的缓冲区中的字节数,即,dst.remaining()
当时尝试读取。其中R为0,读操作完成,立即用结果没有发起一个I/O操作的0
。
假设一个长度字节序列N是阅读,在0 < N <= R.这个字节序列将被转移到缓冲区,序列中的第一个字节在指数P和最后一个字节在指数P + N - 1,其中P是缓冲区的位置,此时读取执行。建成后的缓冲区的位置将等于P + N;极限将不会改变。
缓冲区是不安全的,使用多个并发线程,所以应注意不访问缓冲区,直到操作完成。
这种方法可能在任何时候被调用。某些信道类型可能不允许在任何给定时间内突出的多个读。如果一个线程启动一个读操作之前的读操作之前完成然后ReadPendingException
将抛出。
read
接口
AsynchronousByteChannel
A
-附件的类型
dst
-缓冲区中的字节都被转移
attachment
-连接到I/O操作的对象;可以
null
handler
-完成处理程序
IllegalArgumentException
-如果缓冲区是只读的
ReadPendingException
如果通道不允许多个读的是优秀的和以前的阅读没有完成
NotYetConnectedException
-如果这个通道没有连接
ShutdownChannelGroupException
如果通道组已终止
public abstract Future<Integer> read(ByteBuffer dst)
AsynchronousByteChannel
此方法启动一个异步读操作,从这个通道读取一个字节的序列到给定的缓冲区中。该方法的行为以同样的方式方法的read(ByteBuffer,Object,CompletionHandler)
不是指定完成处理,该方法返回一个Future
表示等待结果。的Future
的get
方法返回读取的字节或字节-1
如果不可以因为信已经达到结束流数。
read
接口
AsynchronousByteChannel
dst
-缓冲区中的字节都被转移
IllegalArgumentException
-如果缓冲区是只读的
ReadPendingException
如果通道不允许多个读的是优秀的和以前的阅读没有完成
NotYetConnectedException
-如果这个通道没有连接
public abstract <A> void read(ByteBuffer[] dsts, int offset, int length, long timeout, TimeUnit unit, A attachment, CompletionHandler<Long,? super A> handler)
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.length
length
-缓冲区的最大数量被访问;必须是非负的且不大于
dsts.length - offset
timeout
- I/O操作完成的最大时间
unit
的
timeout
争论的时间单位
attachment
-连接到I/O操作的对象;可以
null
handler
-消费结果的处理程序
IndexOutOfBoundsException
如果为
offset
和
length
参数不符合条件的预
IllegalArgumentException
-如果缓冲区是只读的
ReadPendingException
-如果一个读操作已在进行中在这个频道
NotYetConnectedException
-如果这个通道没有连接
ShutdownChannelGroupException
如果通道组已终止
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操作的对象;可以
null
handler
-消费结果的处理程序
WritePendingException
-如果一个写操作已在进行中在这个频道
NotYetConnectedException
-如果这个通道没有连接
ShutdownChannelGroupException
如果通道组已终止
public final <A> void write(ByteBuffer src, A attachment, CompletionHandler<Integer,? super A> handler)
AsynchronousByteChannel
此方法启动一个异步写操作,从给定的缓冲区写一个字节的序列到这个通道。的handler
参数是一个结束处理程序被调用时,写操作完成(或失败)。传递给完成处理程序的结果是写入的字节数。
写操作可以写上R字节通道,其中R为剩余的缓冲区中的字节数,即,src.remaining()
当时写的尝试。其中R为0,写操作完成,立即用结果没有发起一个I/O操作的0
。
假设一个字节序列的长度N是书面的,在0 < N <= R.这个字节序列将被从缓冲区开始在指数P转移,其中P是缓冲区的位置,此时写入;的最后一个字节写的指标将P + n - 1。完成后缓冲区的位置将等于P + N;极限将不会改变。
缓冲区是不安全的,使用多个并发线程,所以应注意不访问缓冲区,直到操作完成。
这种方法可能在任何时候被调用。某些信道类型可能不允许在给定时间内超过一个写的突出部分。如果一个线程启动写操作之前的写操作之前完成然后WritePendingException
将抛出。
write
接口
AsynchronousByteChannel
A
-附件的类型
src
-缓冲器字节进行检索
attachment
-连接到I/O操作的对象;可以
null
handler
-完成处理程序对象
WritePendingException
如果通道不允许超过一个写是杰出的和以前写的未完成
NotYetConnectedException
-如果这个通道没有连接
ShutdownChannelGroupException
如果通道组已终止
public abstract Future<Integer> write(ByteBuffer src)
AsynchronousByteChannel
此方法启动一个异步写操作,从给定的缓冲区写一个字节的序列到这个通道。该方法具有完全相同的方式,但不是指定的write(ByteBuffer,Object,CompletionHandler)
完成处理程序的方法,该方法返回一个Future
表示等待结果。的Future
的get
方法返回写入的字节数。
write
接口
AsynchronousByteChannel
src
-缓冲器字节进行检索
WritePendingException
如果通道不允许超过一个写是杰出的和以前写的未完成
NotYetConnectedException
-如果这个通道没有连接
public abstract <A> void write(ByteBuffer[] srcs, int offset, int length, long timeout, TimeUnit unit, A attachment, CompletionHandler<Long,? super A> handler)
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.length
length
-缓冲区的最大数量被访问;必须是非负的且不大于
srcs.length - offset
timeout
- I/O操作完成的最大时间
unit
的
timeout
争论的时间单位
attachment
-连接到I/O操作的对象;可以
null
handler
-消费结果的处理程序
IndexOutOfBoundsException
如果为
offset
和
length
参数不符合条件的预
WritePendingException
-如果一个写操作已在进行中在这个频道
NotYetConnectedException
-如果这个通道没有连接
ShutdownChannelGroupException
如果通道组已终止
public abstract SocketAddress getLocalAddress() throws IOException
在渠道bound
到互联网协议的套接字地址然后从这个方法返回值的类型是InetSocketAddress
。
如果存在安全管理器,它的checkConnect
方法被调用的本地地址和-1
作为它的参数看看操作是允许的。如果操作是不允许的,一个SocketAddress
代表loopback
地址和本地端口的套接字通道返回。
getLocalAddress
接口
NetworkChannel
SocketAddress
,socket,或
SocketAddress
代表回送地址如果由安全经理否认,或
null
如果信道的插座是不受约束的
ClosedChannelException
如果通道关闭
IOException
如果I/O错误发生
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.