-
- All Implemented Interfaces:
-
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_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通道可以安全使用多个并发线程。 他们支持并发阅读和写作,尽管最多只有一个线程可能正在读取,并且最多一个线程可能在任何给定的时间写入。
connect
和finishConnect
方法彼此相互同步,并且在调用这些方法之一的过程中尝试发起发送或接收操作将阻塞直到该调用完成。- 从以下版本开始:
- 1.7
-
-
构造方法摘要
构造方法 Modifier Constructor 描述 protected
SctpChannel(SelectorProvider provider)
初始化此类的新实例。
-
方法摘要
所有方法 静态方法 接口方法 抽象方法 具体的方法 Modifier and Type 方法 描述 abstract Association
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
finishConnect()
完成连接SCTP通道的过程。abstract Set<SocketAddress>
getAllLocalAddresses()
返回此通道的套接字所绑定的所有套接字地址。abstract <T> T
getOption(SctpSocketOption<T> name)
返回套接字选项的值。abstract Set<SocketAddress>
getRemoteAddresses()
返回此通道的套接字所连接的所有远程地址。abstract boolean
isConnectionPending()
告知此频道是否正在进行连接操作。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<?>>
supportedOptions()
返回此通道支持的一组套接字选项。abstract SctpChannel
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
-
-
-
-
构造方法详细信息
-
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
如果通道的插座未连接。 - 异常
-
ClosedChannelException
- 如果通道关闭 -
IOException
- 如果发生其他I / O错误
-
bind
public abstract SctpChannel bind(SocketAddress local) throws IOException
将通道的套接字绑定到本地地址。该方法用于建立套接字和本地地址之间的关系。 一旦建立关系,则套接字保持绑定,直到通道关闭。 这种关系可能不是
local
的地址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
连接此通道的插座。这是一个convience方法,相当于评估以下表达式:
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
,此方法的更多调用将为有必要完全消费这个messgae。 一次只能有一条讯息在任何流中部分传送。 套接字选项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
操作一样。字节将被写入
streamNumber
在给定的messageInfo
指定的流号。可以随时调用此方法。 如果另一个线程已经在该通道上发起了一个发送操作,那么这个方法的调用将被阻塞,直到第一个操作完成。
- 参数
-
src
- 包含要发送的消息的缓冲区 -
messageInfo
- 有关要发送的消息的辅助数据 - 结果
- 发送的字节数,当调用此方法时将是消息缓冲区中剩余的字节数,或者如果此通道不阻塞,则可能为0,如果底层消息的空间不足输出缓冲区
- 异常
-
InvalidStreamException
- 如果streamNumner
为负数或大于或等于输出流的最大数量 -
ClosedChannelException
- 如果此通道关闭 -
AsynchronousCloseException
- 如果另一个线程在读取操作正在进行时关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在读取操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
NotYetConnectedException
- 如果此通道尚未连接 -
IOException
- 如果发生其他I / O错误
-
-