- 所有已实现的接口:
Closeable
,AutoCloseable
,Channel
,InterruptibleChannel
一个 SCTP 通道只能控制一个 SCTP 关联。 SCTPChannel
是通过调用此类的 open
方法之一创建的。新创建的通道已打开但尚未连接,即没有与远程对等点建立关联。尝试在未连接的通道上调用 I/O 操作将导致抛出 NotYetConnectedException
。可以通过使用其 connect
方法之一连接通道来设置关联。连接后,通道将保持连接状态直到关闭。通道是否连接可以通过调用 getRemoteAddresses
来确定。
SCTP 通道支持非阻塞连接:可以创建一个通道,建立到远程套接字的链接的过程可以通过connect
方法启动,稍后由finishConnect
方法完成。连接操作是否正在进行可以通过调用isConnectionPending
方法来确定。
使用 setOption
方法配置套接字选项。 SCTP 通道支持以下选项:
还可以支持其他(特定于实现的)选项。支持的选项列表通过调用
选项名称 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 通道可以安全地供多个并发线程使用。它们支持并发读取和写入,尽管在任何给定时间最多一个线程可能正在读取并且最多一个线程可能正在写入。 connect
和 finishConnect
方法彼此相互同步,并且在调用其中一个方法时尝试启动发送或接收操作将被阻止,直到该调用完成。
- 自从:
- 1.7
-
构造方法总结
构造方法 -
方法总结
修饰符和类型方法描述abstract 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()
返回标识此通道支持的操作的操作集。在类 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
-
构造方法详细信息
-
SctpChannel
初始化此类的新实例。- 参数:
provider
- 此通道的选择器提供程序
-
-
方法详情
-
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
将给定地址添加到通道套接字的绑定地址。给定的地址不能是
wildcard
地址。在调用此方法之前,必须先使用bind
绑定通道,否则将抛出NotYetBoundException
。bind
方法将SocketAddress
作为其参数,该参数通常包含端口号和地址。随后使用此方法绑定的地址只是地址,因为 SCTP 端口号在通道的生命周期内保持不变。将地址添加到连接的关联是可选功能。如果端点支持动态地址重新配置,那么它可以向对等点发送适当的消息以更改对等点地址列表。
- 参数:
address
- 添加到套接字绑定地址的地址- 返回:
- 这个通道
- 抛出:
ClosedChannelException
- 如果此通道关闭ConnectionPendingException
- 如果非阻塞连接操作已经在该通道上进行NotYetBoundException
- 如果此通道尚未绑定AlreadyBoundException
- 如果此通道已绑定到给定地址IllegalArgumentException
- 如果地址是null
或wildcard
地址IOException
- 如果发生其他 I/O 错误
-
unbindAddress
从通道套接字的绑定地址中删除给定地址。给定的地址不能是
wildcard
地址。在调用此方法之前,必须先使用bind
绑定通道,否则将抛出NotYetBoundException
。如果在没有address
作为其绑定地址之一或只有一个本地地址绑定到它的通道上调用此方法,则此方法将抛出IllegalUnbindException
。通道套接字使用bind
绑定到的初始地址可能会从通道套接字的绑定地址中删除。从连接的关联中删除地址是可选功能。如果端点支持动态地址重新配置,那么它可以向对等点发送适当的消息以更改对等点地址列表。
- 参数:
address
- 要从套接字的绑定地址中删除的地址- 返回:
- 这个通道
- 抛出:
ClosedChannelException
- 如果此通道关闭ConnectionPendingException
- 如果非阻塞连接操作已经在该通道上进行NotYetBoundException
- 如果此通道尚未绑定IllegalArgumentException
- 如果地址是null
或wildcard
地址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
,null
如果此通道处于非阻塞模式并且没有消息立即可用,或者通知处理程序在处理通知后返回RETURN
- 抛出:
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 错误
-