-
- 实现的所有接口
-
Closeable,AutoCloseable,Channel,InterruptibleChannel
public abstract class SctpChannel extends AbstractSelectableChannel
面向消息的连接SCTP套接字的可选通道。SCTP通道只能控制一个SCTP关联。 一个
SCTPChannel通过调用的一个创造open种这个类的方法。 新创建的通道已打开但尚未连接,即没有与远程对等方建立关联。 尝试在未连接的通道上调用I / O操作将导致抛出NotYetConnectedException。 可以通过使用其connect方法之一连接通道来设置关联。 连接后,通道保持连接状态,直至关闭。 可以通过调用getRemoteAddresses来确定是否连接了信道。SCTP通道支持非阻塞连接:可以创建通道,并且可以通过
connect方法启动建立到远程套接字的链接的过程,以便稍后通过finishConnect方法完成。 是否正在进行连接操作可以通过调用isConnectionPending方法来确定。使用
setOption方法配置套接字选项。 SCTP通道支持以下选项:
还可以支持其他(特定于实现的)选项。 支持的选项列表是通过调用Option Name 描述 SCTP_DISABLE_FRAGMENTSEnables or disables message fragmentation SCTP_EXPLICIT_COMPLETEEnables or disables explicit message completion SCTP_FRAGMENT_INTERLEAVEControls how the presentation of messages occur for the message receiver SCTP_INIT_MAXSTREAMSThe maximum number of streams requested by the local endpoint during association initialization SCTP_NODELAYEnables or disable a Nagle-like algorithm SCTP_PRIMARY_ADDRRequests that the local SCTP stack use the given peer address as the association primary SCTP_SET_PEER_PRIMARY_ADDRRequests that the peer mark the enclosed address as the association primary SO_SNDBUFThe size of the socket send buffer SO_RCVBUFThe size of the socket receive buffer SO_LINGERLinger on close if data is present (when configured in blocking mode only) supportedOptions方法获得的。SCTP通道可供多个并发线程使用。 它们支持并发读写,但最多只有一个线程可能正在读取,并且最多一个线程可能在任何给定时间写入。
connect和finishConnect方法彼此相互同步,并且在调用其中一个方法时尝试启动发送或接收操作将阻塞,直到该调用完成。- 从以下版本开始:
- 1.7
-
-
构造方法摘要
构造方法 变量 构造器 描述 protectedSctpChannel(SelectorProvider provider)初始化此类的新实例。
-
方法摘要
所有方法 静态方法 实例方法 抽象方法 具体的方法 变量和类型 方法 描述 abstract Associationassociation()返回此通道套接字上的关联。abstract SctpChannelbind(SocketAddress local)将通道的套接字绑定到本地地址。abstract SctpChannelbindAddress(InetAddress address)将给定地址添加到通道套接字的绑定地址。abstract booleanconnect(SocketAddress remote)连接此通道的插座。abstract booleanconnect(SocketAddress remote, int maxOutStreams, int maxInStreams)连接此通道的插座。abstract booleanfinishConnect()完成连接SCTP通道的过程。abstract Set<SocketAddress>getAllLocalAddresses()返回此通道的套接字绑定到的所有套接字地址。abstract <T> TgetOption(SctpSocketOption<T> name)返回套接字选项的值。abstract Set<SocketAddress>getRemoteAddresses()返回此通道的套接字连接的所有远程地址。abstract booleanisConnectionPending()判断此通道上的连接操作是否正在进行中。static SctpChannelopen()打开SCTP通道。static SctpChannelopen(SocketAddress remote, int maxOutStreams, int maxInStreams)打开SCTP通道并将其连接到远程地址。abstract <T> MessageInforeceive(ByteBuffer dst, T attachment, NotificationHandler<T> handler)接收到给定缓冲区的消息和/或处理通知。abstract intsend(ByteBuffer src, MessageInfo messageInfo)通过此频道发送消息。abstract <T> SctpChannelsetOption(SctpSocketOption<T> name, T value)设置套接字选项的值。abstract SctpChannelshutdown()在不关闭通道的情况下关闭连接。abstract Set<SctpSocketOption<?>>supportedOptions()返回此通道支持的一组套接字选项。abstract SctpChannelunbindAddress(InetAddress address)从通道套接字的绑定地址中删除给定地址。intvalidOps()返回标识此通道支持的操作的操作集。-
声明方法的类 java.nio.channels.spi.AbstractSelectableChannel
configureBlocking, implCloseChannel, implCloseSelectableChannel, implConfigureBlocking, provider, register
-
声明方法的类 java.nio.channels.SelectableChannel
blockingLock, isBlocking, isRegistered, keyFor, register
-
声明方法的类 java.nio.channels.spi.AbstractInterruptibleChannel
begin, close, end
-
-
-
-
构造方法详细信息
-
SctpChannel
protected SctpChannel(SelectorProvider provider)
初始化此类的新实例。- 参数
-
provider- 此通道的选择器提供程序
-
-
方法详细信息
-
open
public static SctpChannel open() throws IOException
打开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
public abstract Association association() throws IOException
返回此通道套接字上的关联。- 结果
-
如果通道的套接字未连接,
null关联或null。 - 异常
-
ClosedChannelException- 如果频道已关闭 -
IOException- 如果发生其他一些I / O错误
-
bind
public abstract SctpChannel bind(SocketAddress local) throws IOException
将通道的套接字绑定到本地地址。此方法用于建立套接字和本地地址之间的关系。 一旦建立了关系,套接字将保持绑定直到通道关闭。 这种关系可能不一定与地址
local因为它可能被unbindAddress删除,但是一旦调用此方法成功完成,总会有至少一个本地地址绑定到通道的套接字。一旦通道的套接字已成功绑定到特定地址(未自动分配),可以使用
bindAddress将更多地址绑定到该地址 ,或使用unbindAddress将其删除。- 参数
-
local- 绑定套接字的本地地址,或null将套接字绑定到自动分配的套接字地址 - 结果
- 这个频道
- 异常
-
AlreadyConnectedException- 如果此频道已连接 -
ClosedChannelException- 如果此频道已关闭 -
ConnectionPendingException- 如果此通道上的非阻塞连接操作正在进行中 -
AlreadyBoundException- 如果此通道已绑定 -
UnsupportedAddressTypeException- 如果不支持给定地址的类型 -
IOException- 如果发生其他一些I / O错误 -
SecurityException- 如果已安装安全管理器且其checkListen方法拒绝操作
-
bindAddress
public abstract SctpChannel bindAddress(InetAddress address) throws IOException
将给定地址添加到通道套接字的绑定地址。给定地址不得为
wildcard地址。 在调用此方法之前,必须首先使用bind绑定通道,否则抛出NotYetBoundException。bind方法将SocketAddress作为其参数,通常包含端口号和地址。 使用此方法进行后续绑定的地址只是地址,因为SCTP端口号在通道的生命周期内保持不变。将地址添加到已连接的关联是可选功能。 如果端点支持动态地址重新配置,则它可以向对等体发送适当的消息以更改对等体地址列表。
- 参数
-
address- 要添加到套接字的绑定地址的地址 - 结果
- 这个频道
- 异常
-
ClosedChannelException- 如果此渠道已关闭 -
ConnectionPendingException- 如果此通道上的非阻塞连接操作正在进行中 -
NotYetBoundException- 如果此频道尚未绑定 -
AlreadyBoundException- 如果此通道已绑定到给定地址 -
IllegalArgumentException- 如果地址是null或wildcard地址 -
IOException- 如果发生其他一些I / O错误
-
unbindAddress
public abstract SctpChannel unbindAddress(InetAddress address) throws IOException
从通道套接字的绑定地址中删除给定地址。给定的地址不能是
wildcard地址。 在调用此方法之前,必须首先使用bind绑定通道,否则抛出NotYetBoundException。 如果在没有address作为其绑定地址之一或仅绑定了一个本地地址的通道上调用此方法,则此方法将抛出IllegalUnbindException。 可以从通道套接字的绑定地址中删除通道的套接字使用bind绑定的初始地址。从连接的关联中删除地址是可选功能。 如果端点支持动态地址重新配置,则它可以向对等体发送适当的消息以更改对等体地址列表。
- 参数
-
address- 要从套接字的绑定地址中删除的地址 - 结果
- 这个频道
- 异常
-
ClosedChannelException- 如果此频道已关闭 -
ConnectionPendingException- 如果此通道上的非阻塞连接操作正在进行中 -
NotYetBoundException- 如果此频道尚未绑定 -
IllegalArgumentException- 如果地址是null或wildcard地址 -
IllegalUnbindException- 如果address未绑定到通道的套接字。 或者频道只有一个绑定的地址 -
IOException- 如果发生其他一些I / O错误
-
connect
public abstract boolean connect(SocketAddress remote) throws IOException
连接此通道的插座。如果此通道处于非阻塞模式,则调用此方法将启动非阻塞连接操作。 如果立即建立连接(如本地连接可能发生),则此方法返回
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
public abstract boolean finishConnect() throws IOException完成连接SCTP通道的过程。通过将套接字通道置于非阻塞模式然后调用其中一个
connect方法来启动非阻塞连接操作。 建立连接或尝试失败后,通道将变为可连接,并且可以调用此方法以完成连接顺序。 如果连接操作失败,则调用此方法将导致引发适当的IOException。如果此通道已连接,则此方法不会阻止,并将立即返回
true。 如果此通道处于非阻塞模式,则如果连接过程尚未完成,则此方法将返回false。 如果此通道处于阻塞模式,则此方法将阻塞,直到连接完成或失败,并始终返回true或抛出描述失败的已检查异常。可以随时调用此方法。 如果在调用此方法的同时调用此通道上的
send或receive操作,则该操作将首先阻塞,直到此调用完成。 如果连接尝试失败,即,如果此方法的调用抛出已检查的异常,则将关闭该通道。- 结果
-
true当且仅当此通道的套接字现在已连接时 - 异常
-
NoConnectionPendingException- 如果未连接此通道且尚未启动连接操作 -
ClosedChannelException- 如果此频道已关闭 -
AsynchronousCloseException- 如果另一个线程在连接操作正在进行时关闭此通道 -
ClosedByInterruptException- 如果另一个线程在连接操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
IOException- 如果发生其他一些I / O错误
-
getAllLocalAddresses
public abstract Set<SocketAddress> getAllLocalAddresses() throws IOException
返回此通道的套接字绑定到的所有套接字地址。- 结果
-
此通道的套接字绑定的所有套接字地址,如果通道的套接字未绑定,
Set空Set - 异常
-
ClosedChannelException- 如果频道已关闭 -
IOException- 如果发生I / O错误
-
getRemoteAddresses
public abstract Set<SocketAddress> getRemoteAddresses() throws IOException
返回此通道的套接字连接的所有远程地址。如果通道连接到绑定到多个地址的远程对等方,则通道的套接字连接的是这些地址。
- 结果
-
此通道插座所连接的所有远程地址,如果通道的插座未连接,
Set空Set - 异常
-
ClosedChannelException- 如果频道已关闭 -
IOException- 如果发生I / O错误
-
shutdown
public abstract SctpChannel shutdown() throws IOException
在不关闭通道的情况下关闭连接。向远程对等方发送shutdown命令,有效防止任何对等方将任何新数据写入套接字。 进一步发送将抛出
ClosedChannelException。 通道保持打开状态,以允许在收到关闭命令之前接收可能已由对等方发送的任何数据(和通知)。 如果通道已关闭,则调用此方法无效。- 结果
- 这个频道
- 异常
-
NotYetConnectedException- 如果此频道尚未连接 -
ClosedChannelException- 如果此频道已关闭 -
IOException- 如果发生其他一些I / O错误
-
getOption
public abstract <T> T getOption(SctpSocketOption<T> name) throws IOException
返回套接字选项的值。- 参数类型
-
T- 套接字选项值的类型 - 参数
-
name- 套接字选项 - 结果
-
套接字选项的值。
值
null可能是某些套接字选项的有效值。 - 异常
-
UnsupportedOperationException- 如果此通道不支持套接字选项 -
ClosedChannelException- 如果此渠道已关闭 -
IOException- 如果发生I / O错误 - 另请参见:
-
SctpStandardSocketOptions
-
setOption
public abstract <T> SctpChannel setOption(SctpSocketOption<T> name, T value) throws IOException
设置套接字选项的值。- 参数类型
-
T- 套接字选项值的类型 - 参数
-
name- 套接字选项 -
value- 套接字选项的值。 值null可能是某些套接字选项的有效值。 - 结果
- 这个频道
- 异常
-
UnsupportedOperationException- 如果此通道不支持套接字选项 -
IllegalArgumentException- 如果该值不是此套接字选项的有效值 -
ClosedChannelException- 如果此频道已关闭 -
IOException- 如果发生I / O错误 - 另请参见:
-
SctpStandardSocketOptions
-
supportedOptions
public abstract Set<SctpSocketOption<?>> supportedOptions()
返回此通道支持的一组套接字选项。即使在关闭通道后,此方法仍将继续返回选项集。
- 结果
- 此通道支持的一组套接字选项
-
validOps
public final int validOps()
返回标识此通道支持的操作的操作集。SCTP通道支持连接,读取和写入,因此该方法返回
(SelectionKey.OP_CONNECT|SelectionKey.OP_READ|SelectionKey.OP_WRITE)。- Specified by:
-
validOps在类SelectableChannel - 结果
- 有效操作集
-
receive
public abstract <T> MessageInfo receive(ByteBuffer dst, T attachment, NotificationHandler<T> handler) throws IOException
接收到给定缓冲区的消息和/或处理通知。如果消息或通知立即可用,或者此通道处于阻止模式且最终可用,则分别返回或处理消息或通知。 如果此通道处于非阻塞模式且消息或通知未立即可用,则此方法立即返回
null。如果此方法收到消息,则将其复制到给定的字节缓冲区中。 消息从当前位置开始传送到给定的字节缓冲区,缓冲区位置按读取的字节数递增。 如果缓冲区中剩余的字节数少于保存消息所需的字节数,或者底层输入缓冲区不包含完整消息,则返回的MessageInfo上的
MessageInfo的调用将返回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
public abstract int send(ByteBuffer src, MessageInfo messageInfo) throws IOException
通过此频道发送消息。如果此通道处于非阻塞模式且底层输出缓冲区中有足够的空间,或者此通道处于阻塞模式且有足够的空间可用,则给定字节缓冲区中的剩余字节将作为单个消息传输。 除非在此通道的套接字上启用了显式消息完成
SCTP_EXPLICIT_COMPLETE套接字选项,否则发送消息是原子的。消息从字节缓冲区传输,就像通过常规
write操作一样。字节将写入给定
messageInfo由streamNumber指定的流编号。可以随时调用此方法。 如果另一个线程已经在此通道上启动了发送操作,则此方法的调用将阻塞,直到第一个操作完成。
- 参数
-
src- 包含要发送的消息的缓冲区 -
messageInfo- 有关要发送的消息的辅助数据 - 结果
- 发送的字节数,可以是调用此方法时消息缓冲区中剩余的字节数,或者,如果此通道是非阻塞的,如果底层的消息没有足够的空间,则可能为零输出缓冲区
- 异常
-
InvalidStreamException- 如果streamNumner为负数或大于或等于传出流的最大数量 -
ClosedChannelException- 如果此频道已关闭 -
AsynchronousCloseException- 如果另一个线程在读取操作正在进行时关闭此通道 -
ClosedByInterruptException- 如果另一个线程在读操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
NotYetConnectedException- 如果此频道尚未连接 -
IOException- 如果发生其他一些I / O错误
-
-