- 所有已实现的接口:
-
Closeable
,AutoCloseable
,Channel
,InterruptibleChannel
SCTP多通道支持在单个套接字上的多个关联。通过调用此类的open
方法创建一个SctpMultiChannel
。新创建的通道是打开的,但尚未绑定。尝试在未绑定的通道上调用receive
方法将导致抛出NotYetBoundException
。尝试在未绑定的通道上调用send
方法将导致首先调用bind
方法。可以通过调用getAllLocalAddresses
来检索通道套接字绑定到的地址。
可以在不显式建立与远程对等方的关联的情况下发送和接收消息。如果与该对等方尚未建立关联,则每当通道向远程对等方发送或接收消息时,通道将隐式建立新关联。成功建立关联后,将使用其event
参数设置为COMM_UP
的association changed
通知将被放入SCTP堆栈中。此通知可以通过调用receive
来接收。
可以使用setOption
方法配置套接字选项。一个SctpMultiChannel
支持以下选项:
还可以支持其他(特定于实现的)选项。通过调用
选项名称 描述 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
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionabstract Set
<Association> 返回此通道套接字上的打开关联。final SctpMultiChannel
bind
(SocketAddress local) 将通道套接字绑定到本地地址并配置套接字以侦听连接。abstract SctpMultiChannel
bind
(SocketAddress local, int backlog) 将通道套接字绑定到本地地址并配置套接字以侦听连接。abstract SctpMultiChannel
bindAddress
(InetAddress address) 将给定地址添加到通道套接字的绑定地址中。abstract SctpChannel
branch
(Association association) 分支出一个关联。abstract Set
<SocketAddress> 返回此通道套接字绑定到的所有套接字地址。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<?>> 返回此通道支持的套接字选项的集合。abstract SctpMultiChannel
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
-
SctpMultiChannel
初始化此类的新实例。- 参数:
-
provider
- 此通道的选择器提供程序
-
-
Method Details
-
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
将给定地址添加到通道套接字的绑定地址中。给定地址不能是
通配符
地址。在调用此方法之前,必须首先使用bind
绑定通道,否则将抛出NotYetBoundException
。bind
方法以SocketAddress
作为其参数,通常包含端口号以及地址。随后使用此方法绑定的地址仅仅是地址,因为SCTP端口号在通道的生命周期内保持不变。成功完成此方法后设置的新关联将与给定地址关联。向现有关联添加地址是可选功能。如果端点支持动态地址重新配置,则可能向对等方发送适当的消息以更改对等方的地址列表。
- 参数:
-
address
- 要从套接字的绑定地址中删除的地址 - 返回:
- 此通道
- 抛出:
-
ClosedChannelException
- 如果此通道已关闭 -
NotYetBoundException
- 如果此通道尚未绑定 -
AlreadyBoundException
- 如果此通道已绑定到给定地址 -
IllegalArgumentException
- 如果地址为null
或为通配符
地址 -
IOException
- 如果发生其他I/O错误
-
unbindAddress
从通道套接字的绑定地址中删除给定地址。给定地址不能是
通配符
地址。在调用此方法之前,必须首先使用bind
绑定通道,否则将抛出NotYetBoundException
。如果在没有
address
作为其绑定地址之一的通道上调用此方法,或者只有一个本地地址绑定到它,则此方法将抛出IllegalUnbindException
。使用
bind
绑定通道套接字的初始地址可能会从通道套接字的绑定地址中删除。成功完成此方法后设置的新关联将不与给定地址关联。从现有关联中删除地址是可选功能。如果端点支持动态地址重新配置,则可能向对等方发送适当的消息以更改对等方的地址列表。
- 参数:
-
address
- 要从套接字的绑定地址中删除的地址 - 返回:
- 此通道
- 抛出:
-
ClosedChannelException
- 如果此通道已关闭 -
NotYetBoundException
- 如果此通道尚未绑定 -
IllegalUnbindException
-address
未绑定到通道的套接字,或通道只绑定了一个地址 -
IllegalArgumentException
- 如果地址为null
或为通配符
地址 -
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
- socket选项值的类型 - 参数:
-
name
- socket选项 -
association
- 应该检索其选项的关联,如果应该在通道的套接字级别检索此选项,则为null
。 - 返回:
-
socket选项的值。对于某些socket选项,
null
可能是有效的值。 - 抛出:
-
UnsupportedOperationException
- 如果此通道不支持该socket选项 -
ClosedChannelException
- 如果此通道已关闭 -
IOException
- 如果发生I/O错误 - 参见:
-
setOption
public abstract <T> SctpMultiChannel setOption(SctpSocketOption<T> name, T value, Association association) throws IOException 设置socket选项的值。请注意,某些选项是在通道的套接字上检索的,因此
association
参数不适用,如果给定将被忽略。但是,如果选项是特定于关联的,则必须提供关联。- 类型参数:
-
T
- socket选项值的类型 - 参数:
-
name
- socket选项 -
value
- socket选项的值。对于某些socket选项,null
可能是有效的值。 -
association
- 应该设置其选项的关联,如果应该在通道的套接字级别设置此选项,则为null
。 - 返回:
- 此通道
- 抛出:
-
UnsupportedOperationException
- 如果此通道不支持该socket选项 -
IllegalArgumentException
- 如果值对于此socket选项无效 -
ClosedChannelException
- 如果此通道已关闭 -
IOException
- 如果发生I/O错误 - 参见:
-
supportedOptions
返回此通道支持的socket选项集。即使通道已关闭,此方法仍将返回选项集。
- 返回:
- 此通道支持的socket选项集
-
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
- 要附加到接收操作的对象;可以是null
-
handler
- 用于处理来自SCTP堆栈的通知的处理程序,或null
以忽略任何通知。 - 返回:
-
MessageInfo
,如果此通道处于非阻塞模式且没有消息立即可用,或者通知处理程序在处理通知后返回RETURN
,则返回null
- 抛出:
-
ClosedChannelException
- 如果此通道已关闭 -
AsynchronousCloseException
- 如果另一个线程在读取操作进行中关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在读取操作进行中中断当前线程,从而关闭通道并设置当前线程的中断状态 -
NotYetBoundException
- 如果此通道尚未绑定 -
IllegalReceiveException
- 如果给定处理程序调用此通道的receive
方法 -
SecurityException
- 如果已安装安全管理器且不允许从消息发送者接受新关联 -
IOException
- 如果发生其他I/O错误
-
send
通过此通道发送消息。如果此通道未绑定,则在发送任何数据之前,此方法将调用
bind(null, 0)
。如果此通道的套接字与给定messageInfo中的地址标识的预期接收方之间不存在关联,则将自动为预期接收方建立关联。这被视为隐式关联设置。成功建立关联后,将向SCTP堆栈放置一个带有
event
参数设置为COMM_UP
的关联更改
通知。可以通过调用receive
来接收此通知。如果此通道处于阻塞模式,底层输出缓冲区中有足够的空间,则给定字节缓冲区中剩余的字节将作为单个消息传输。发送消息是原子的,除非在此通道的套接字上启用了显式消息完成
SCTP_EXPLICIT_COMPLETE
套接字选项。如果此通道处于非阻塞模式,底层输出缓冲区中有足够的空间,并且需要进行隐式关联设置,则给定字节缓冲区中剩余的字节将作为单个消息传输,受
SCTP_EXPLICIT_COMPLETE
的影响。如果由于任何原因无法传递消息,则将在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错误
-