- 所有已实现的接口:
-
Closeable
,AutoCloseable
,Channel
,InterruptibleChannel
SCTP通道只能控制一个SCTP关联。通过调用此类的一个open
方法来创建一个SCTPChannel
。新创建的通道是打开的,但尚未连接,也就是说,尚未与远程对等方建立关联。在未连接的通道上调用I/O操作将导致抛出NotYetConnectedException
。可以通过使用通道的一个connect
方法来建立关联。一旦连接,通道保持连接状态直到关闭。可以通过调用getRemoteAddresses
来确定通道是否连接。
SCTP通道支持非阻塞连接: 可以创建通道并通过connect
方法启动建立与远程套接字的链接的过程,以便稍后由finishConnect
方法完成。可以通过调用isConnectionPending
方法来确定连接操作是否正在进行。
可以使用setOption
方法配置套接字选项。SCTP通道支持以下选项:
还可以支持其他(特定于实现的)选项。通过调用
选项名称 描述 SCTP_DISABLE_FRAGMENTS
启用或禁用消息分段 SCTP_EXPLICIT_COMPLETE
启用或禁用显式消息完成 SCTP_FRAGMENT_INTERLEAVE
控制消息接收方的消息呈现方式 SCTP_INIT_MAXSTREAMS
在关联初始化期间由本地端点请求的最大流数 SCTP_NODELAY
启用或禁用类似Nagle的算法 SCTP_PRIMARY_ADDR
请求本地SCTP堆栈将给定的对等地址用作关联主地址 SCTP_SET_PEER_PRIMARY_ADDR
请求对等方将封装的地址标记为关联主地址 SO_SNDBUF
套接字发送缓冲区的大小 SO_RCVBUF
套接字接收缓冲区的大小 SO_LINGER
在关闭时保持数据(仅在阻塞模式下配置时)
supportedOptions
方法获取支持的选项列表。
SCTP通道可安全用于多个并发线程。它们支持并发读写,尽管在任何给定时间最多只能有一个线程在读取,最多只能有一个线程在写入。connect
和finishConnect
方法在彼此之间是互斥同步的,而在进行这些方法调用时尝试启动发送或接收操作将会阻塞,直到该调用完成。
- 自Java版本:
- 1.7
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionabstract Association
返回此通道套接字上的关联。abstract SctpChannel
bind
(SocketAddress local) 将通道套接字绑定到本地地址。abstract SctpChannel
bindAddress
(InetAddress address) 将给定地址添加到通道套接字的绑定地址中。abstract boolean
connect
(SocketAddress remote) 连接此通道套接字。abstract boolean
connect
(SocketAddress remote, int maxOutStreams, int maxInStreams) 连接此通道套接字。abstract boolean
完成连接SCTP通道的过程。abstract Set
<SocketAddress> 返回此通道套接字绑定的所有套接字地址。abstract <T> T
getOption
(SctpSocketOption<T> name) 返回套接字选项的值。abstract Set
<SocketAddress> 返回此通道套接字连接的所有远程地址。abstract boolean
告知此通道上是否正在进行连接操作。static SctpChannel
open()
打开一个SCTP通道。static SctpChannel
open
(SocketAddress remote, int maxOutStreams, int maxInStreams) 打开一个SCTP通道并将其连接到远程地址。abstract <T> MessageInfo
receive
(ByteBuffer dst, T attachment, NotificationHandler<T> handler) 将消息接收到给定缓冲区中和/或处理通知。abstract int
send
(ByteBuffer src, MessageInfo messageInfo) 通过此通道发送消息。abstract <T> SctpChannel
setOption
(SctpSocketOption<T> name, T value) 设置套接字选项的值。abstract SctpChannel
shutdown()
在不关闭通道的情况下关闭连接。abstract Set
<SctpSocketOption<?>> 返回此通道支持的套接字选项的集合。abstract SctpChannel
unbindAddress
(InetAddress address) 从通道套接字的绑定地址中删除给定地址。final int
validOps()
返回标识此通道支持的操作的操作集。Methods declared in class java.nio.channels.spi.AbstractSelectableChannel
blockingLock, configureBlocking, implCloseChannel, implCloseSelectableChannel, implConfigureBlocking, isBlocking, isRegistered, keyFor, provider, register
Methods declared in class java.nio.channels.SelectableChannel
register
Methods declared in class java.nio.channels.spi.AbstractInterruptibleChannel
begin, close, end, isOpen
-
Constructor Details
-
SctpChannel
初始化此类的新实例。- 参数:
-
provider
- 此通道的选择器提供程序
-
-
Method Details
-
open
打开一个SCTP通道。新通道未绑定且未连接。
- 返回:
- 一个新的SCTP通道
- 抛出:
-
UnsupportedOperationException
- 如果不支持SCTP协议 -
IOException
- 如果发生I/O错误
-
open
public static SctpChannel open(SocketAddress remote, int maxOutStreams, int maxInStreams) throws IOException 打开一个SCTP通道并将其连接到远程地址。这是一个便利方法,等效于评估以下表达式:
open().connect(remote, maxOutStreams, maxInStreams);
- 参数:
-
remote
- 要连接新通道的远程地址 -
maxOutStreams
- 应用程序希望能够发送的流的数量。必须是非负数且不大于65536
。0
表示使用端点的默认值。 -
maxInStreams
- 应用程序准备支持的最大入站流数。必须是非负数且不大于65536
。0
表示使用端点的默认值。 - 返回:
- 连接到给定地址的新SCTP通道
- 抛出:
-
AsynchronousCloseException
- 如果另一个线程在连接操作进行中关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在连接操作进行中中断当前线程,从而关闭通道并设置当前线程的中断状态 -
UnresolvedAddressException
- 如果给定的远程地址未完全解析 -
UnsupportedAddressTypeException
- 如果给定的远程地址类型不受支持 -
SecurityException
- 如果已安装安全管理器并且不允许访问给定的远程对等方 -
UnsupportedOperationException
- 如果不支持SCTP协议 -
IOException
- 如果发生其他I/O错误
-
association
返回此通道套接字上的关联。- 返回:
-
关联,如果通道套接字未连接,则返回
null
。 - 抛出:
-
ClosedChannelException
- 如果通道已关闭 -
IOException
- 如果发生其他I/O错误
-
bind
将通道的套接字绑定到本地地址。此方法用于在套接字和本地地址之间建立关系。一旦建立关系,套接字将保持绑定状态,直到通道关闭。此关系可能不一定是与地址
local
绑定,因为它可能会被unbindAddress
移除,但一旦此方法成功完成调用,通道的套接字将始终至少绑定一个本地地址。一旦通道的套接字成功绑定到特定地址(而非自动分配的地址),可以使用
bindAddress
绑定更多地址,或使用unbindAddress
移除地址。- 参数:
-
local
- 要绑定套接字的本地地址,或者null
以将套接字绑定到自动分配的套接字地址 - 返回:
- 此通道
- 抛出:
-
AlreadyConnectedException
- 如果此通道已连接 -
ClosedChannelException
- 如果此通道已关闭 -
ConnectionPendingException
- 如果此通道上已经存在非阻塞连接操作 -
AlreadyBoundException
- 如果此通道已绑定 -
UnsupportedAddressTypeException
- 如果给定地址的类型不受支持 -
IOException
- 如果发生其他I/O错误 -
SecurityException
- 如果已安装安全管理器且其checkListen
方法拒绝操作
-
bindAddress
将给定地址添加到通道套接字的绑定地址中。给定地址不能是
通配符
地址。在调用此方法之前,必须首先使用bind
绑定通道,否则将抛出NotYetBoundException
异常。bind
方法以SocketAddress
作为参数,通常包含端口号和地址。随后使用此方法绑定的地址仅为地址,因为SCTP端口号在通道的生命周期内保持不变。向已连接的关联添加地址是可选功能。如果端点支持动态地址重新配置,则可能向对等方发送适当的消息以更改对等方地址列表。
- 参数:
-
address
- 要添加到套接字绑定地址的地址 - 返回:
- 此通道
- 抛出:
-
ClosedChannelException
- 如果此通道已关闭 -
ConnectionPendingException
- 如果此通道上已经存在非阻塞连接操作 -
NotYetBoundException
- 如果此通道尚未绑定 -
AlreadyBoundException
- 如果此通道已绑定到给定地址 -
IllegalArgumentException
- 如果地址为null
或通配符
地址 -
IOException
- 如果发生其他I/O错误
-
unbindAddress
从通道套接字的绑定地址中移除给定地址。给定地址不能是
通配符
地址。在调用此方法之前,必须首先使用bind
绑定通道,否则将抛出NotYetBoundException
异常。如果在只有一个本地地址绑定到通道的情况下,对不具有address
作为其绑定地址之一的通道调用此方法,或者只有一个本地地址绑定到通道的情况下,此方法将抛出IllegalUnbindException
。使用bind
方法绑定通道套接字的初始地址可能会从通道套接字的绑定地址中移除。从已连接的关联中移除地址是可选功能。如果端点支持动态地址重新配置,则可能向对等方发送适当的消息以更改对等方地址列表。
- 参数:
-
address
- 要从套接字绑定地址中移除的地址 - 返回:
- 此通道
- 抛出:
-
ClosedChannelException
- 如果此通道已关闭 -
ConnectionPendingException
- 如果此通道上已经存在非阻塞连接操作 -
NotYetBoundException
- 如果此通道尚未绑定 -
IllegalArgumentException
- 如果地址为null
或通配符
地址 -
IllegalUnbindException
- 如果address
未绑定到通道的套接字,或通道只绑定了一个地址 -
IOException
- 如果发生其他I/O错误
-
connect
连接此通道的套接字。如果此通道处于非阻塞模式,则调用此方法将启动非阻塞连接操作。如果连接立即建立,例如在本地连接中可能发生的情况,则此方法返回
true
。否则,此方法返回false
,连接操作必须稍后通过调用finishConnect
方法完成。如果此通道处于阻塞模式,则调用此方法将阻塞,直到建立连接或发生I/O错误。
如果已安装安全管理器,则此方法将验证其
checkConnect
方法是否允许连接到给定远程对等方的地址和端口号。此方法可以随时调用。如果在此方法正在进行的同时调用此通道上的
send
或receive
操作,则该操作将首先阻塞,直到此调用完成。如果尝试连接但失败,即如果调用此方法引发已检查异常,则通道将被关闭。- 参数:
-
remote
- 要连接到的远程对等体 - 返回:
-
true
如果建立了连接,false
如果此通道处于非阻塞模式且连接操作正在进行中 - 抛出:
-
AlreadyConnectedException
- 如果此通道已经连接 -
ConnectionPendingException
- 如果非阻塞连接操作已在此通道上进行 -
ClosedChannelException
- 如果此通道已关闭 -
AsynchronousCloseException
- 如果另一个线程在连接操作进行中关闭了此通道 -
ClosedByInterruptException
- 如果另一个线程在连接操作进行中中断了当前线程,从而关闭了通道并设置了当前线程的中断状态 -
UnresolvedAddressException
- 如果给定的远程地址尚未完全解析 -
UnsupportedAddressTypeException
- 如果给定的远程地址的类型不受支持 -
SecurityException
- 如果已安装安全管理器并且不允许访问给定的远程对等体 -
IOException
- 如果发生其他I/O错误
-
connect
public abstract boolean connect(SocketAddress remote, int maxOutStreams, int maxInStreams) throws IOException 连接此通道的套接字。这是一个便利方法,等效于评估以下表达式:
setOption(SctpStandardSocketOptions.SCTP_INIT_MAXSTREAMS, SctpStandardSocketOption.InitMaxStreams.create(maxInStreams, maxOutStreams)) .connect(remote);
maxOutStreams
和maxInStreams
参数表示应用程序希望能够发送到和接收自远程对等体的最大流数。它们将与远程对等体协商,并可能受操作系统限制。- 参数:
-
remote
- 要连接到的远程对等体 -
maxOutStreams
- 必须是非负数且不大于65536
。0
表示使用端点的默认值。 -
maxInStreams
- 必须是非负数且不大于65536
。0
表示使用端点的默认值。 - 返回:
-
true
如果建立了连接,false
如果此通道处于非阻塞模式且连接操作正在进行中 - 抛出:
-
AlreadyConnectedException
- 如果此通道已经连接 -
ConnectionPendingException
- 如果非阻塞连接操作已在此通道上进行 -
ClosedChannelException
- 如果此通道已关闭 -
AsynchronousCloseException
- 如果另一个线程在连接操作进行中关闭了此通道 -
ClosedByInterruptException
- 如果另一个线程在连接操作进行中中断了当前线程,从而关闭了通道并设置了当前线程的中断状态 -
UnresolvedAddressException
- 如果给定的远程地址尚未完全解析 -
UnsupportedAddressTypeException
- 如果给定的远程地址的类型不受支持 -
SecurityException
- 如果已安装安全管理器并且不允许访问给定的远程对等体 -
IOException
- 如果发生其他I/O错误
-
isConnectionPending
public abstract boolean isConnectionPending()告知此通道是否正在进行连接操作。- 返回:
-
true
当且仅当在此通道上已启动连接操作但尚未通过调用finishConnect()
方法完成时
-
finishConnect
完成连接 SCTP 通道的过程。通过将套接字通道置于非阻塞模式,然后调用其
connect
方法之一来启动非阻塞连接操作。一旦建立连接或尝试失败,通道将变为可连接状态,可以调用此方法来完成连接序列。如果连接操作失败,则调用此方法将导致抛出适当的IOException
。如果此通道已连接,则此方法不会阻塞并将立即返回
true
。如果此通道处于非阻塞模式,则如果连接过程尚未完成,则此方法将返回false
。如果此通道处于阻塞模式,则此方法将阻塞,直到连接完成或失败,并且始终会返回true
或抛出描述失败的已检查异常。此方法可以随时调用。如果在此方法的调用过程中调用此通道上的
send
或receive
操作,则该操作将首先阻塞,直到此调用完成。如果连接尝试失败,即如果此方法的调用引发已检查异常,则通道将被关闭。- 返回:
-
true
当且仅当此通道的套接字现在已连接 - 抛出:
-
NoConnectionPendingException
- 如果此通道未连接且未启动连接操作 -
ClosedChannelException
- 如果此通道已关闭 -
AsynchronousCloseException
- 如果另一个线程在连接操作进行中关闭了此通道 -
ClosedByInterruptException
- 如果另一个线程在连接操作进行中中断了当前线程,从而关闭了通道并设置了当前线程的中断状态 -
IOException
- 如果发生其他I/O错误
-
getAllLocalAddresses
返回此通道的套接字绑定到的所有套接字地址。- 返回:
-
此通道的套接字绑定到的所有套接字地址,如果通道的套接字未绑定,则返回空的
Set
- 抛出:
-
ClosedChannelException
- 如果通道已关闭 -
IOException
- 如果发生 I/O 错误
-
getRemoteAddresses
返回此通道的套接字连接到的所有远程地址。如果通道连接到绑定到多个地址的远程对等体,则通道的套接字连接到这些地址。
- 返回:
-
此通道的套接字连接到的所有远程地址,如果通道的套接字未连接,则返回空的
Set
- 抛出:
-
ClosedChannelException
- 如果通道已关闭 -
IOException
- 如果发生 I/O 错误
-
shutdown
关闭连接而不关闭通道。向远程对等体发送关闭命令,有效地阻止任何对等体写入套接字的新数据。进一步的发送将抛出
ClosedChannelException
。通道保持打开状态,以允许接收可能已被对等体发送的任何数据(和通知),在接收到关闭命令之前。如果通道已关闭,则调用此方法不会产生任何效果。- 返回:
- 此通道
- 抛出:
-
NotYetConnectedException
- 如果此通道尚未连接 -
ClosedChannelException
- 如果此通道已关闭 -
IOException
- 如果发生其他I/O错误
-
getOption
返回套接字选项的值。- 类型参数:
-
T
- 套接字选项值的类型 - 参数:
-
name
- 套接字选项 - 返回:
-
套接字选项的值。对于某些套接字选项,
null
可能是有效的值。 - 抛出:
-
UnsupportedOperationException
- 如果此通道不支持该套接字选项 -
ClosedChannelException
- 如果此通道已关闭 -
IOException
- 如果发生I/O错误 - 参见:
-
setOption
设置套接字选项的值。- 类型参数:
-
T
- 套接字选项值的类型 - 参数:
-
name
- 套接字选项 -
value
- 套接字选项的值。对于某些套接字选项,null
可能是有效的值。 - 返回:
- 此通道
- 抛出:
-
UnsupportedOperationException
- 如果此通道不支持该套接字选项 -
IllegalArgumentException
- 如果值对于此套接字选项无效 -
ClosedChannelException
- 如果此通道已关闭 -
IOException
- 如果发生I/O错误 - 参见:
-
supportedOptions
返回此通道支持的套接字选项的集合。即使通道已关闭,此方法仍将返回选项集。
- 返回:
- 此通道支持的套接字选项集合
-
validOps
public final int validOps()返回标识此通道支持的操作的操作集。SCTP通道支持连接、读取和写入,因此此方法返回
(
SelectionKey.OP_CONNECT
|
SelectionKey.OP_READ
|
SelectionKey.OP_WRITE
)
。- 指定者:
-
validOps
在类SelectableChannel
- 返回:
- 有效操作集
-
receive
public abstract <T> MessageInfo receive(ByteBuffer dst, T attachment, NotificationHandler<T> handler) throws IOException 接收给定缓冲区中的消息和/或处理通知。如果消息或通知立即可用,或者如果此通道处于阻塞模式并且最终变得可用,则返回或处理消息或通知。如果此通道处于非阻塞模式且消息或通知不立即可用,则此方法立即返回
null
。如果此方法接收到消息,则将其复制到给定的字节缓冲区中。消息将从当前位置开始传输到给定的字节缓冲区,并且缓冲区的位置将增加读取的字节数。如果缓冲区中剩余的字节数少于所需的消息大小,或者底层输入缓冲区不包含完整的消息,则在返回的
MessageInfo
上调用isComplete
,将返回false
,并且需要更多次调用此方法才能完全消耗消息。在任何流中一次只会部分传递一个消息。套接字选项SCTP_FRAGMENT_INTERLEAVE
控制消息交错的各个方面。如果此方法接收到通知,则调用给定处理程序的适当方法(如果有)。如果处理程序返回
CONTINUE
,则此方法将尝试接收另一条消息/通知,否则,如果处理通知后处理程序返回RETURN
,则此方法将返回null
。如果处理程序抛出未捕获的异常,它将通过此方法向上传播堆栈。此方法可以随时调用。如果另一个线程已经在此通道上启动了接收操作,则对此方法的调用将阻塞,直到第一个操作完成。调用给定处理程序时不会持有用于执行上述同步策略的任何锁,这样处理程序将不会阻止其他线程接收。如果处理程序调用此通道的
receive
方法,将抛出一个IllegalReceiveException
。- 类型参数:
-
T
- 附件的类型 - 参数:
-
dst
- 要传输消息字节的缓冲区 -
attachment
- 要附加到接收操作的对象;可以是null
-
handler
- 用于处理来自SCTP堆栈的通知的处理程序,或null
以忽略任何通知。 - 返回:
-
MessageInfo
,如果此通道处于非阻塞模式且没有消息立即可用,或者通知处理程序在处理通知后返回RETURN
,则返回null
- 抛出:
-
ClosedChannelException
- 如果此通道已关闭 -
AsynchronousCloseException
- 如果另一个线程在读取操作进行中关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在读取操作进行中中断当前线程,从而关闭通道并设置当前线程的中断状态 -
NotYetConnectedException
- 如果此通道尚未连接 -
IllegalReceiveException
- 如果给定处理程序调用此通道的receive
方法 -
IOException
- 如果发生其他I/O错误
-
send
通过此通道发送消息。如果此通道处于非阻塞模式且底层输出缓冲区有足够的空间,或者如果此通道处于阻塞模式且有足够的空间可用,则给定字节缓冲区中的剩余字节将作为单个消息传输。发送消息是原子的,除非在此通道的套接字上启用了显式消息完成
SCTP_EXPLICIT_COMPLETE
套接字选项。消息将从字节缓冲区中转移,就像通过常规的
write
操作一样。字节将写入由给定
messageInfo
中的streamNumber
指定的流号。此方法可以随时调用。如果另一个线程已经在此通道上启动了发送操作,则对此方法的调用将阻塞,直到第一个操作完成。
- 参数:
-
src
- 包含要发送的消息的缓冲区 -
messageInfo
- 要发送的消息的附加数据 - 返回值:
- 发送的字节数,可能是调用此方法时消息缓冲区中剩余的字节数,或者如果此通道是非阻塞的,则可能为零,如果底层输出缓冲区中没有足够的空间来容纳消息
- 抛出:
-
InvalidStreamException
- 如果streamNumner
为负数或大于等于最大传出流的数量 -
ClosedChannelException
- 如果此通道已关闭 -
AsynchronousCloseException
- 如果另一个线程在读取操作进行中关闭了此通道 -
ClosedByInterruptException
- 如果另一个线程在读取操作进行中中断了当前线程,从而关闭了通道并设置了当前线程的中断状态 -
NotYetConnectedException
- 如果此通道尚未连接 -
IOException
- 如果发生其他I/O错误
-