- java.lang.Object
-
- java.nio.channels.spi.AbstractInterruptibleChannel
-
- java.nio.channels.SelectableChannel
-
- java.nio.channels.spi.AbstractSelectableChannel
-
- com.sun.nio.sctp.SctpMultiChannel
-
- All Implemented Interfaces:
-
Closeable
,AutoCloseable
,Channel
,InterruptibleChannel
public abstract class SctpMultiChannel extends AbstractSelectableChannel
用于面向消息的SCTP套接字的可选通道。SCTP多通道支持单个插座上的许多关联。 通过调用此类的
open
方法创建一个SctpMultiChannel
。 新创建的频道是开放但尚未绑定的。 尝试调用未绑定通道的receive
方法将导致抛出NotYetBoundException
。 尝试调用未绑定通道的send
方法将导致它首先调用bind
方法。 通过调用getAllLocalAddresses
可以检索通道的套接字所绑定的地址 。可以发送和接收消息,而不显式地建立与远程对等体的关联。 只要发送或接收来自远程对等体的消息,如果没有与该对等体的关联,则该信道将隐式地建立新的关联。 关联设置成功后,将向SCTP堆栈发送
association changed
通知,其event
参数设置为COMM_UP
。 该通知可以通过调用receive
接收。套接字选项使用
setOption
方法进行配置。 一个SctpMultiChannel
支持以下选项:Option Name 描述 SCTP_DISABLE_FRAGMENTS
Enables or disables message fragmentation SCTP_EXPLICIT_COMPLETE
Enables or disables explicit message completion SCTP_FRAGMENT_INTERLEAVE
Controls how the presentation of messages occur for the message receiver SCTP_INIT_MAXSTREAMS
The maximum number of streams requested by the local endpoint during association initialization SCTP_NODELAY
Enables or disable a Nagle-like algorithm SCTP_PRIMARY_ADDR
Requests that the local SCTP stack use the given peer address as the association primary SCTP_SET_PEER_PRIMARY_ADDR
Requests that the peer mark the enclosed address as the association primary SO_SNDBUF
The size of the socket send buffer SO_RCVBUF
The size of the socket receive buffer SO_LINGER
Linger on close if data is present (when configured in blocking mode only) supportedOptions
方法获得的。SCTP多通道可以安全使用多个并发线程。 它们支持并发发送和接收,尽管最多只有一个线程可能发送,并且在任何给定的时间最多有一个线程可能正在接收。
- 从以下版本开始:
- 1.7
-
-
构造方法摘要
构造方法 Modifier Constructor 描述 protected
SctpMultiChannel(SelectorProvider provider)
初始化此类的新实例。
-
方法摘要
所有方法 静态方法 接口方法 抽象方法 具体的方法 Modifier and Type 方法 描述 abstract Set<Association>
associations()
返回此通道的套接字上的打开关联。SctpMultiChannel
bind(SocketAddress local)
将通道的套接字绑定到本地地址,并配置套接字以监听连接。abstract SctpMultiChannel
bind(SocketAddress local, int backlog)
将通道的套接字绑定到本地地址,并配置套接字以监听连接。abstract SctpMultiChannel
bindAddress(InetAddress address)
将给定地址添加到通道插座的绑定地址。abstract SctpChannel
branch(Association association)
分支协会。abstract Set<SocketAddress>
getAllLocalAddresses()
返回此通道的套接字所绑定的所有套接字地址。abstract <T> T
getOption(SctpSocketOption<T> name, Association association)
返回套接字选项的值。abstract Set<SocketAddress>
getRemoteAddresses(Association association)
返回此通道的套接字连接给定关联的所有远程地址。static SctpMultiChannel
open()
打开SCTP多通道。abstract <T> MessageInfo
receive(ByteBuffer buffer, T attachment, NotificationHandler<T> handler)
接收消息和/或通过此频道处理通知。abstract int
send(ByteBuffer buffer, MessageInfo messageInfo)
通过此频道发送消息。abstract <T> SctpMultiChannel
setOption(SctpSocketOption<T> name, T value, Association association)
设置套接字选项的值。abstract SctpMultiChannel
shutdown(Association association)
关闭关联而不关闭通道。abstract Set<SctpSocketOption<?>>
supportedOptions()
返回此通道支持的一组套接字选项。abstract SctpMultiChannel
unbindAddress(InetAddress address)
从通道的套接字的绑定地址中删除给定的地址。int
validOps()
返回确定此频道支持的操作的操作集。-
Methods inherited from class java.nio.channels.spi.AbstractInterruptibleChannel
begin, close, end, isOpen
-
Methods inherited from class java.nio.channels.spi.AbstractSelectableChannel
blockingLock, configureBlocking, implCloseChannel, implCloseSelectableChannel, implConfigureBlocking, isBlocking, isRegistered, keyFor, provider, register
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from class java.nio.channels.SelectableChannel
register
-
-
-
-
构造方法详细信息
-
SctpMultiChannel
protected SctpMultiChannel(SelectorProvider provider)
初始化此类的新实例。- 参数
-
provider
- 此通道的选择器提供程序
-
-
方法详细信息
-
open
public static SctpMultiChannel open() throws IOException
打开SCTP多通道。新渠道未绑定。
- 结果
- 一个新的SCTP多频道
- 异常
-
UnsupportedOperationException
- 如果不支持SCTP协议 -
IOException
- 如果发生I / O错误
-
associations
public abstract Set<Association> associations() throws IOException
返回此通道的套接字上的打开关联。只有已经收到
COMM_UP
关联变更事件的关联才包含在返回的关联集中。 已经收到COMM_LOST
或SHUTDOWN
关联更改事件的关联从该组关联中移除。返回的关联集是在调用此方法时打开的关联的快照。
- 结果
-
A
Set
包含打开的关联,如果没有,Set
空Set
。 - 异常
-
ClosedChannelException
- 如果此频道关闭 -
IOException
- 如果发生其他I / O错误
-
bind
public abstract SctpMultiChannel bind(SocketAddress local, int backlog) throws IOException
将通道的套接字绑定到本地地址,并配置套接字以监听连接。该方法用于建立套接字和本地地址之间的关系。 一旦建立关系,则套接字保持绑定,直到通道关闭。 这种关系可能不是
local
的地址local
因为它可能会被unbindAddress
删除,但是一旦调用此方法成功完成,将始终至少有一个本地地址绑定到通道的套接字。一旦通道的套接字已成功绑定到特定地址,则不会自动分配,可能会使用
bindAddress
绑定更多地址,或使用unbindAddress
删除。backlog参数是套接字上挂起连接的最大数量。 其确切语义是实现具体的。 实现可以强制实现特定的最大长度,或者可以选择忽略该参数。 如果backlog参数的值为
0
或负值,则使用实现特定的默认值。- 参数
-
local
- 绑定套接字的本地地址,或null
将套接字绑定到自动分配的套接字地址 -
backlog
- 挂起连接的最大数量 - 结果
- 这个频道
- 异常
-
ClosedChannelException
- 如果此通道关闭 -
AlreadyBoundException
- 如果此频道已经绑定 -
UnsupportedAddressTypeException
- 如果不支持给定地址的类型 -
SecurityException
- 如果已安装安全管理员,并且其checkListen
方法拒绝操作 -
IOException
- 如果发生其他I / O错误
-
bind
public final SctpMultiChannel bind(SocketAddress local) throws IOException
将通道的套接字绑定到本地地址,并配置套接字以监听连接。这个方法的工作原理就像调用它相当于评估表达式:
bind(local, 0);
- 参数
-
local
- 绑定套接字的本地地址,或null
将套接字绑定到自动分配的套接字地址 - 结果
- 这个频道
- 异常
-
ClosedChannelException
- 如果此通道关闭 -
AlreadyBoundException
- 如果此频道已经绑定 -
UnsupportedAddressTypeException
- 如果不支持给定地址的类型 -
SecurityException
- 如果已安装安全管理员,并且其checkListen
方法拒绝操作 -
IOException
- 如果发生其他I / O错误
-
bindAddress
public abstract SctpMultiChannel bindAddress(InetAddress address) throws IOException
将给定地址添加到通道插座的绑定地址。给定的地址不能是
wildcard
地址。 在调用此方法之前,必须首先使用bind
绑定通道,否则抛出NotYetBoundException
。bind
方法需要一个SocketAddress
作为其参数,通常包含端口号和地址。 使用此方法子地绑定的地址只是地址,因为SCTP端口号在通道的生存期内保持不变。此方法成功完成后,新建关联设置将与给定地址关联。 向现有关联添加地址是可选功能。 如果端点支持动态地址重新配置,那么它可以向对等体发送适当的消息来改变对等体地址列表。
- 参数
-
address
- 要添加到套接字绑定地址的地址 - 结果
- 这个频道
- 异常
-
ClosedChannelException
- 如果此频道关闭 -
NotYetBoundException
- 如果此频道尚未绑定 -
AlreadyBoundException
- 如果此频道已经绑定到给定的地址 -
IllegalArgumentException
- 如果地址是null
或wildcard
地址 -
IOException
- 如果发生其他I / O错误
-
unbindAddress
public abstract SctpMultiChannel unbindAddress(InetAddress address) throws IOException
从通道的套接字的绑定地址中删除给定的地址。给定的地址不能是
wildcard
地址。 在调用此方法之前,必须先使用bind
绑定通道,否则抛出NotYetBoundException
。如果在没有
address
作为其绑定地址之一或只有一个本地地址绑定的通道上调用此方法,则该方法将抛出IllegalUnbindException
。通道的套接字使用
bind
绑定的初始地址可能会从通道插座的绑定地址中删除。此方法成功完成后,新的关联设置将不会与给定的地址相关联。 从现有关联中删除地址是可选功能。 如果端点支持动态地址重新配置,那么它可以向对等体发送适当的消息来改变对等体地址列表。
- 参数
-
address
- 从套接字的绑定地址中删除的地址 - 结果
- 这个频道
- 异常
-
ClosedChannelException
- 如果此通道关闭 -
NotYetBoundException
- 如果此频道尚未绑定 -
IllegalUnbindException
-address
未绑定到通道的套接字,或者通道只有一个地址与其绑定 -
IllegalArgumentException
- 如果地址是null
或wildcard
地址 -
IOException
- 如果发生其他I / O错误
-
getAllLocalAddresses
public abstract Set<SocketAddress> getAllLocalAddresses() throws IOException
返回此通道的套接字所绑定的所有套接字地址。- 结果
-
该通道的套接字所绑定的所有套接字地址,如果通道的套接字未绑定,
Set
空Set
- 异常
-
ClosedChannelException
- 如果通道关闭 -
IOException
- 如果发生I / O错误
-
getRemoteAddresses
public abstract Set<SocketAddress> getRemoteAddresses(Association association) throws IOException
返回此通道的套接字连接给定关联的所有远程地址。- 参数
-
association
- 协会 - 结果
-
给定关联的所有远程地址,如果关联已关闭,
Set
空Set
- 异常
-
ClosedChannelException
- 如果通道关闭 -
IOException
- 如果发生I / O错误
-
shutdown
public abstract SctpMultiChannel shutdown(Association association) throws IOException
关闭关联而不关闭通道。- 参数
-
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错误 - 另请参见:
-
SctpStandardSocketOptions
-
setOption
public abstract <T> SctpMultiChannel setOption(SctpSocketOption<T> name, T value, Association association) throws IOException
设置套接字选项的值。请注意,某些选项在通道的套接字上检索,因此
association
参数不适用,如果给出将被忽略。 但是,如果选项是关联特定的,则必须给出关联。- 参数类型
-
T
- 套接字选项值的类型 - 参数
-
name
- 套接字选项 -
association
- 应该设置选项的关联,如果该选项应设置在通道的套接字级别,null
。 -
value
- 套接字选项的值。 值为null
可能是某些套接字选项的有效值。 - 结果
- 这个频道
- 异常
-
UnsupportedOperationException
- 如果此通道不支持套接字选项 -
IllegalArgumentException
- 如果该值不是此套接字选项的有效值 -
ClosedChannelException
- 如果此通道关闭 -
IOException
- 如果发生I / O错误 - 另请参见:
-
SctpStandardSocketOptions
-
supportedOptions
public abstract Set<SctpSocketOption<?>> supportedOptions()
返回此通道支持的一组套接字选项。即使通道关闭后,此方法仍将继续返回该选项。
- 结果
- 此通道支持的一组套接字选项
-
validOps
public final int validOps()
返回确定此频道支持的操作的操作集。SCTP多通道支持阅读和写作,所以这种方法返回
(
SelectionKey.OP_READ
|
SelectionKey.OP_WRITE
)
。- Specified by:
-
validOps
在SelectableChannel
- 结果
- 有效操作集
-
receive
public abstract <T> MessageInfo receive(ByteBuffer buffer, T attachment, NotificationHandler<T> handler) throws IOException
接收消息和/或通过此频道处理通知。如果消息或通知立即可用,或者如果此通道处于阻塞模式,并且最终变为可用,则分别返回或处理消息或通知。 如果此通道处于非阻塞模式,并且消息或通知不能立即可用,则此方法将立即返回
null
。如果此方法接收到一条消息,则将其复制到给定的字节缓冲区中,并返回一个
MessageInfo
。 该消息从其当前位置开始传送到给定的字节缓冲区,并且缓冲区位置以读取的字节数增加。 如果缓冲区中剩余的字节少于保存消息所需的字节数,或者底层输入缓冲区不包含完整消息,那么在返回的MessageInfo上调用MessageInfo
将返回false
,并且此方法的更多调用将为有必要完全消费这个messgae。 一次只能有一条讯息在任何流中部分传送。 套接字选项SCTP_FRAGMENT_INTERLEAVE
控制发生消息隔行扫描的各个方面。如果此方法接收到通知,则调用给定处理程序的适当方法(如果有)。 如果处理程序返回
CONTINUE
,则此方法将尝试接收另一条消息/通知,否则,如果返回RETURN
,则此方法将返回null
。 如果处理程序抛出未捕获的异常,它将通过此方法传播到堆栈中。如果已经安装了一个安全管理器,那么对于每个新的关联设置,该方法验证安全管理器的
checkAccept
方法允许关联源地址和端口号。可以随时调用此方法。 如果另一个线程已经在该通道上启动了接收操作,则该方法的调用将阻塞,直到第一个操作完成。 调用给定的处理程序而不用任何用于执行上述同步策略的锁,这样处理程序不会阻止其他线程接收。 处理程序不应该调用此通道的
receive
方法,如果它将抛出IllegalReceiveException
。- 参数类型
-
T
- 附件的类型 - 参数
-
buffer
- 要传输字节的缓冲区 -
attachment
- 附加到接收操作的对象; 可以是null
-
handler
- 处理来自SCTP堆栈的通知的处理程序,或null
忽略任何通知。 - 结果
-
的
MessageInfo
,null
如果此通道处于非阻塞模式和没有消息可立即或通知处理程序返回RETURN
处理的通知后 - 异常
-
ClosedChannelException
- 如果此通道关闭 -
AsynchronousCloseException
- 如果另一个线程在读取操作正在进行时关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在读取操作正在进行中断当前线程,从而关闭通道并设置当前线程的中断状态 -
NotYetBoundException
- 如果此频道尚未绑定 -
IllegalReceiveException
- 如果给定的处理程序调用此通道的receive
方法 -
SecurityException
- 如果已安装安全管理员,并且不允许从邮件的发件人接受新的关联 -
IOException
- 如果发生其他I / O错误
-
send
public abstract int send(ByteBuffer buffer, MessageInfo messageInfo) throws IOException
通过此频道发送消息。如果此通道未绑定,则此方法将在发送任何数据之前调用
bind(null, 0)
。如果该通道的套接字和预定接收方之间没有关联,由给定messageInfo中的地址标识,那么将自动设置为预期的接收者。 这被认为是隐式关联设置。 关联设置成功后,将向SCTP堆栈发送
association changed
通知,其event
参数设置为COMM_UP
。 该通知可以通过调用receive
接收。如果此通道处于阻塞模式,底层输出缓冲区中有足够的空间,则给定字节缓冲区中的剩余字节作为单个消息传输。 发送消息是原子的,除非在此通道的套接字上启用显式消息完成
SCTP_EXPLICIT_COMPLETE
套接字选项。如果该通道处于非阻塞模式,则底层输出缓冲区中有足够的空间,并且需要隐式关联设置,则给定字节缓冲区中的剩余字节将作为单个消息传输,但须遵守
SCTP_EXPLICIT_COMPLETE
。 如果由于任何原因,无法传送该消息, 则将其event
参数设置为CANT_START
,将SCTP堆栈上的通知置于association changed
。消息从字节缓冲区传输,就像通过常规的
write
操作一样。如果已经安装了安全管理器,那么对于每个新的关联设置,该方法验证安全管理器的
checkConnect
方法允许给定的远程对等体地址和端口号。可以随时调用此方法。 如果另一个线程已经在该通道上发起了一个发送操作,那么这个方法的调用将被阻塞,直到第一个操作完成。
- 参数
-
buffer
- 包含要发送的消息的缓冲区 -
messageInfo
- 有关要发送的消息的辅助数据 - 结果
- 发送的字节数,当调用此方法时将是消息缓冲区中剩余的字节数,或者如果此通道不阻塞,则可能为0,如果底层消息的空间不足输出缓冲区
- 异常
-
InvalidStreamException
- 如果streamNumber
为负,或者如果关联已经存在,并且streamNumber
大于输出流的最大数量 -
ClosedChannelException
- 如果此通道关闭 -
AsynchronousCloseException
- 如果另一个线程在读取操作正在进行时关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在读取操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
SecurityException
- 如果已安装安全管理员,并且不允许使用邮件地址设置新的关联 -
IOException
- 如果发生其他I / O错误
-
branch
public abstract SctpChannel branch(Association association) throws IOException
分支协会。应用程序可以调用此方法将关联分支到单独的通道中。 将为该协会创建新的绑定和连接的
SctpChannel
。 分支关联将不再是此渠道的一部分。当例如应用程序希望有许多零星的消息发送者/接收者保留在原始SCTP多信道之下,但是将携带高容量数据业务的关联分支到它们自己的单独的SCTP信道中时,这是特别有用的。
- 参数
-
association
- 关联分支 - 结果
-
SctpChannel
- 异常
-
ClosedChannelException
- 如果此频道关闭 -
IOException
- 如果发生其他I / O错误
-
-