- 所有已实现的接口:
Closeable,AutoCloseable,Channel,InterruptibleChannel
SCTP 多通道支持单个套接字上的多个关联。通过调用此类的 open 方法创建 SctpMultiChannel。新创建的通道已打开但尚未绑定。尝试调用未绑定通道的 receive 方法将导致抛出 NotYetBoundException 。尝试调用未绑定通道的 send 方法将导致它首先调用 bind 方法。可以通过调用 getAllLocalAddresses 检索通道套接字绑定的地址。
可以在不显式设置与远程对等方的关联的情况下发送和接收消息。如果还没有与远程对等方的关联,则通道将在它从远程对等方发送或接收消息时隐式建立新的关联。关联设置成功后,association changed 通知将被放入 SCTP 堆栈,其 event 参数设置为 COMM_UP 。可以通过调用 receive 接收此通知。
使用 setOption 方法配置套接字选项。 SctpMultiChannel 支持以下选项:
还可以支持其他(特定于实现的)选项。支持的选项列表通过调用
选项名称 Description 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 多通道可以安全地供多个并发线程使用。它们支持并发发送和接收,尽管在任何给定时间最多一个线程可以发送并且最多一个线程可以接收。
- 自从:
- 1.7
-
构造方法总结
构造方法 -
方法总结
修饰符和类型方法描述abstract Set<Association>返回此通道套接字上的打开关联。final SctpMultiChannelbind(SocketAddress local) 将通道的套接字绑定到本地地址并配置套接字以监听连接。abstract SctpMultiChannelbind(SocketAddress local, int backlog) 将通道的套接字绑定到本地地址并配置套接字以监听连接。abstract SctpMultiChannelbindAddress(InetAddress address) 将给定地址添加到通道套接字的绑定地址。abstract SctpChannelbranch(Association association) 分支出一个关联.abstract Set<SocketAddress>返回此通道的套接字绑定到的所有套接字地址。abstract <T> TgetOption(SctpSocketOption<T> name, Association association) 返回套接字选项的值。abstract Set<SocketAddress>getRemoteAddresses(Association association) 返回此通道套接字上给定关联所连接到的所有远程地址。static SctpMultiChannelopen()打开 SCTP 多通道。abstract <T> MessageInforeceive(ByteBuffer buffer, T attachment, NotificationHandler<T> handler) 通过此通道接收消息和/或处理通知。abstract intsend(ByteBuffer buffer, MessageInfo messageInfo) 通过此通道发送消息。abstract <T> SctpMultiChannelsetOption(SctpSocketOption<T> name, T value, Association association) 设置套接字选项的值。abstract SctpMultiChannelshutdown(Association association) 在不关闭通道的情况下关闭关联。abstract Set<SctpSocketOption<?>>返回此通道支持的一组套接字选项。abstract SctpMultiChannelunbindAddress(InetAddress address) 从通道套接字的绑定地址中删除给定地址。final intvalidOps()返回标识此通道支持的操作的操作集。在类 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
-
构造方法详细信息
-
SctpMultiChannel
初始化此类的新实例。- 参数:
provider- 此通道的选择器提供程序
-
-
方法详情
-
open
打开 SCTP 多通道。新通道未绑定。
- 返回:
- 新的 SCTP 多通道
- 抛出:
UnsupportedOperationException- 如果不支持 SCTP 协议IOException- 如果发生 I/O 错误
-
associations
返回此通道套接字上的打开关联。只有已收到
COMM_UP关联更改事件的关联才包含在返回的关联集中。已接收到COMM_LOST或SHUTDOWN关联更改事件的关联将从关联集中删除。返回的关联集是调用此方法时打开的关联的快照。
- 返回:
-
包含开放关联的
Set,如果没有,则为空的Set。 - 抛出:
ClosedChannelException- 如果此通道关闭IOException- 如果发生其他 I/O 错误
-
bind
将通道的套接字绑定到本地地址并配置套接字以监听连接。该方法用于建立套接字和本地地址之间的关系。一旦建立了关系,套接字就会保持绑定状态,直到通道关闭。这种关系不一定与地址
local相关,因为它可能会被unbindAddress删除,但是一旦成功完成此方法的调用,总会有至少一个本地地址绑定到通道的套接字。一旦通道的套接字成功绑定到特定地址(不会自动分配),更多地址可以使用
bindAddress绑定到它,或使用unbindAddress删除。backlog 参数是套接字上挂起连接的最大数量。它的确切语义是特定于实现的。一个实现可以强加一个特定于实现的最大长度,或者可以选择忽略该参数。如果 backlog 参数的值为
0或负值,则使用特定于实现的默认值。- 参数:
local- 绑定套接字的本地地址,或null将套接字绑定到自动分配的套接字地址backlog- 最大挂起连接数- 返回:
- 这个通道
- 抛出:
ClosedChannelException- 如果此通道关闭AlreadyBoundException- 如果这个通道已经绑定UnsupportedAddressTypeException- 如果不支持给定地址的类型SecurityException- 如果安装了安全管理器并且其checkListen方法拒绝操作IOException- 如果发生其他 I/O 错误
-
bind
将通道的套接字绑定到本地地址并配置套接字以监听连接。此方法的工作原理就好像调用它等同于计算表达式:
bind(local, 0);
- 参数:
local- 绑定套接字的本地地址,或null将套接字绑定到自动分配的套接字地址- 返回:
- 这个通道
- 抛出:
ClosedChannelException- 如果此通道关闭AlreadyBoundException- 如果这个通道已经绑定UnsupportedAddressTypeException- 如果不支持给定地址的类型SecurityException- 如果安装了安全管理器并且其checkListen方法拒绝操作IOException- 如果发生其他 I/O 错误
-
bindAddress
将给定地址添加到通道套接字的绑定地址。给定的地址不能是
wildcard地址。在调用此方法之前,必须首先使用bind绑定通道,否则将抛出NotYetBoundException。bind方法将SocketAddress作为其参数,该参数通常包含端口号和地址。随后使用此方法绑定的地址只是地址,因为 SCTP 端口号在通道的生命周期内保持不变。此方法成功完成后的新关联设置将与给定地址关联。将地址添加到现有关联是可选功能。如果端点支持动态地址重新配置,那么它可以向对等点发送适当的消息以更改对等点地址列表。
- 参数:
address- 添加到套接字绑定地址的地址- 返回:
- 这个通道
- 抛出:
ClosedChannelException- 如果此通道关闭NotYetBoundException- 如果此通道尚未绑定AlreadyBoundException- 如果此通道已绑定到给定地址IllegalArgumentException- 如果地址是null或wildcard地址IOException- 如果发生其他 I/O 错误
-
unbindAddress
从通道套接字的绑定地址中删除给定地址。给定的地址不能是
wildcard地址。在调用此方法之前,必须首先使用bind绑定通道,否则将抛出NotYetBoundException。如果在没有将
address作为其绑定地址之一或仅绑定一个本地地址的通道上调用此方法,则此方法将抛出IllegalUnbindException。使用
bind绑定通道套接字的初始地址可能会从通道套接字的绑定地址中删除。此方法成功完成后的新关联设置将不会与给定地址关联。从现有关联中删除地址是可选功能。如果端点支持动态地址重新配置,那么它可以向对等点发送适当的消息以更改对等点地址列表。
- 参数:
address- 要从套接字的绑定地址中删除的地址- 返回:
- 这个通道
- 抛出:
ClosedChannelException- 如果此通道关闭NotYetBoundException- 如果此通道尚未绑定IllegalUnbindException-address没有绑定到通道的套接字,或者通道只有一个地址绑定到它IllegalArgumentException- 如果地址是null或wildcard地址IOException- 如果发生其他 I/O 错误
-
getAllLocalAddresses
返回此通道的套接字绑定到的所有套接字地址。- 返回:
-
此通道的套接字绑定到的所有套接字地址,如果未绑定通道的套接字,则为空
Set - 抛出:
ClosedChannelException- 如果通道关闭IOException- 如果发生 I/O 错误
-
getRemoteAddresses
返回此通道套接字上给定关联所连接到的所有远程地址。- 参数:
association- 协会- 返回:
-
给定关联的所有远程地址,如果关联已关闭,则为空
Set - 抛出:
ClosedChannelException- 如果通道关闭IOException- 如果发生 I/O 错误
-
shutdown
在不关闭通道的情况下关闭关联。- 参数:
association- 关闭关联- 返回:
- 这个通道
- 抛出:
ClosedChannelException- 如果此通道关闭IOException- 如果发生其他 I/O 错误
-
getOption
public abstract <T> T getOption(SctpSocketOption <T> name, Association association) throws IOException 返回套接字选项的值。请注意,某些选项是在通道的套接字上检索的,因此
association参数不适用,如果给出将被忽略。但是,如果选项是关联特定的,则必须给出关联。- 类型参数:
T- 套接字选项值的类型- 参数:
name- 套接字选项association- 应检索其选项的关联,或者null如果应在通道的套接字级别检索此选项。- 返回:
-
套接字选项的值。
null的值可能是某些套接字选项的有效值。 - 抛出:
UnsupportedOperationException- 如果此通道不支持套接字选项ClosedChannelException- 如果此通道关闭IOException- 如果发生 I/O 错误- 参见:
-
setOption
public abstract <T> SctpMultiChannel setOption(SctpSocketOption <T> name, T value, Association association) throws IOException 设置套接字选项的值。请注意,某些选项是在通道的套接字上检索的,因此
association参数不适用,如果给出将被忽略。但是,如果选项是关联特定的,则必须给出关联。- 类型参数:
T- 套接字选项值的类型- 参数:
name- 套接字选项value- 套接字选项的值。null的值可能是某些套接字选项的有效值。association- 应设置其选项的关联,或者null如果应在通道的套接字级别设置此选项。- 返回:
- 这个通道
- 抛出:
UnsupportedOperationException- 如果此通道不支持套接字选项IllegalArgumentException- 如果该值不是此套接字选项的有效值ClosedChannelException- 如果此通道关闭IOException- 如果发生 I/O 错误- 参见:
-
supportedOptions
返回此通道支持的一组套接字选项。即使在通道关闭后,此方法仍将继续返回选项集。
- 返回:
- 此通道支持的一组套接字选项
-
validOps
public final int validOps()返回标识此通道支持的操作的操作集。SCTP多通道支持读写,所以该方法返回
(SelectionKey.OP_READ|SelectionKey.OP_WRITE)。- 指定者:
validOps在类SelectableChannel中- 返回:
- 有效操作集
-
receive
public abstract <T> MessageInfo receive(ByteBuffer buffer, T attachment, NotificationHandler <T> handler) throws IOException 通过此通道接收消息和/或处理通知。如果消息或通知立即可用,或者如果此通道处于阻塞模式并且最终可用,则分别返回或处理消息或通知。如果此通道处于非阻塞模式并且消息或通知不是立即可用,则此方法立即返回
null。如果此方法收到一条消息,它会被复制到给定的字节缓冲区中,并返回一个
MessageInfo。消息从其当前位置开始传输到给定的字节缓冲区中,缓冲区位置按读取的字节数递增。如果缓冲区中剩余的字节数少于保存消息所需的字节数,或者底层输入缓冲区不包含完整的消息,则在返回的MessageInfo上调用isComplete将返回false,并且此方法的更多调用将是完全消耗消息所必需的。一次只有一条消息将在任何流中部分传递。套接字选项SCTP_FRAGMENT_INTERLEAVE控制消息交错的各个方面。如果此方法收到通知,则调用给定处理程序的适当方法(如果有的话)。如果处理程序返回
CONTINUE那么此方法将尝试接收另一条消息/通知,否则,如果返回RETURN此方法将返回null。如果处理程序抛出未捕获的异常,它将通过此方法向上传播到堆栈。如果安装了安全管理器,则对于每个新的关联设置,此方法验证安全管理器的
checkAccept方法是否允许关联源地址和端口号。可以随时调用此方法。如果另一个线程已经在该通道上启动了接收操作,则该方法的调用将阻塞,直到第一个操作完成。调用给定的处理程序时不会持有任何用于强制执行上述同步策略的锁,这样处理程序就不会阻止其他线程接收。处理程序不应调用此通道的
receive方法,否则将抛出IllegalReceiveException。- 类型参数:
T- 附件类型- 参数:
buffer- 要将字节传输到的缓冲区attachment- 附加到接收操作的对象;可以是nullhandler- 处理来自 SCTP 堆栈的通知的处理程序,或null忽略任何通知。- 返回:
MessageInfo,null如果此通道处于非阻塞模式并且没有消息立即可用,或者通知处理程序在处理通知后返回RETURN- 抛出:
ClosedChannelException- 如果此通道关闭AsynchronousCloseException- 如果另一个线程在读取操作正在进行时关闭此通道ClosedByInterruptException- 如果另一个线程在读取操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态NotYetBoundException- 如果此通道尚未绑定IllegalReceiveException- 如果给定的处理程序调用此通道的receive方法SecurityException- 如果安装了安全管理器并且它不允许接受来自邮件发件人的新关联IOException- 如果发生其他 I/O 错误
-
send
通过此通道发送消息。如果此通道未绑定,则此方法将在发送任何数据之前调用
bind(null, 0)。如果此通道的套接字与预期接收者之间不存在关联(由给定 messageInfo 中的地址标识),则将自动设置为预期接收者。这被认为是隐式关联设置。关联设置成功后,
association changed通知将被放入 SCTP 堆栈,其event参数设置为COMM_UP。可以通过调用receive接收此通知。如果此通道处于阻塞模式,底层输出缓冲区中有足够的空间,则给定字节缓冲区中的剩余字节将作为单个消息传输。除非在此通道的套接字上启用显式消息完成
SCTP_EXPLICIT_COMPLETE套接字选项,否则发送消息是原子的。如果此通道处于非阻塞模式,底层输出缓冲区中有足够的空间,并且需要隐式关联设置,则给定字节缓冲区中的剩余字节将作为单个消息传输,受
SCTP_EXPLICIT_COMPLETE约束。如果由于任何原因无法传递消息,则会将association changed通知放在 SCTP 堆栈上,并将其event参数设置为CANT_START。消息从字节缓冲区传输,就像通过常规
write操作一样。如果安装了安全管理器,则对于每个新的关联设置,此方法验证安全管理器的
checkConnect方法是否允许给定的远程对等地址和端口号。可以随时调用此方法。如果另一个线程已经在此通道上发起发送操作,则此方法的调用将阻塞,直到第一个操作完成。
- 参数:
buffer- 包含要发送的消息的缓冲区messageInfo- 有关要发送的消息的辅助数据- 返回:
- 发送的字节数,这将是调用此方法时消息缓冲区中剩余的字节数,或者,如果此通道是非阻塞的,如果底层消息没有足够的空间,则可能为零输出缓冲器
- 抛出:
InvalidStreamException- 如果streamNumber为负,或者如果关联已经存在并且streamNumber大于传出流的最大数量ClosedChannelException- 如果此通道关闭AsynchronousCloseException- 如果另一个线程在读取操作正在进行时关闭此通道ClosedByInterruptException- 如果另一个线程在读取操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态SecurityException- 如果安装了安全管理器并且它不允许与消息地址建立新的关联IOException- 如果发生其他 I/O 错误
-
branch
分支出一个关联.应用程序可以调用此方法将关联分支到单独的通道中。将为关联创建新的绑定和连接的
SctpChannel。分支协会将不再是该通道的一部分。例如,当应用程序希望在原始 SCTP 多通道下保留一些零星的消息发送者/接收者,但将那些承载大量数据流量的关联分支到它们自己的独立 SCTP 通道时,这尤其有用。
- 参数:
association- 协会分支- 返回:
SctpChannel- 抛出:
ClosedChannelException- 如果此通道关闭IOException- 如果发生其他 I/O 错误
-