Module jdk.sctp
Package com.sun.nio.sctp

Class SctpMultiChannel

所有已实现的接口:
Closeable, AutoCloseable, Channel, InterruptibleChannel

public abstract class SctpMultiChannel extends AbstractSelectableChannel
用于面向消息的SCTP套接字的可选择通道。

SCTP多通道支持在单个套接字上的多个关联。通过调用此类的open方法创建一个SctpMultiChannel。新创建的通道是打开的,但尚未绑定。尝试在未绑定的通道上调用receive方法将导致抛出NotYetBoundException。尝试在未绑定的通道上调用send方法将导致首先调用bind方法。可以通过调用getAllLocalAddresses来检索通道套接字绑定到的地址。

可以在不显式建立与远程对等方的关联的情况下发送和接收消息。如果与该对等方尚未建立关联,则每当通道向远程对等方发送或接收消息时,通道将隐式建立新关联。成功建立关联后,将使用其event参数设置为COMM_UPassociation 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 Details

    • SctpMultiChannel

      protected SctpMultiChannel(SelectorProvider provider)
      初始化此类的新实例。
      参数:
      provider - 此通道的选择器提供程序
  • Method Details

    • 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_LOSTSHUTDOWN关联更改事件的关联将从关联集中移除。

      返回的关联集是在调用此方法时通道上的打开关联的快照。

      返回:
      包含打开关联的Set,如果没有则为空Set
      抛出:
      ClosedChannelException - 如果此通道已关闭
      IOException - 如果发生其他I/O错误
    • bind

      public abstract SctpMultiChannel bind(SocketAddress local, int backlog) throws IOException
      将通道套接字绑定到本地地址并配置套接字以侦听连接。

      此方法用于建立套接字与本地地址之间的关系。一旦建立关系,套接字将保持绑定直到通道关闭。此关系可能不一定是与地址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
      将给定地址添加到通道套接字的绑定地址中。

      给定地址不能是通配符地址。在调用此方法之前,必须首先使用bind绑定通道,否则将抛出NotYetBoundExceptionbind方法以SocketAddress作为其参数,通常包含端口号以及地址。随后使用此方法绑定的地址仅仅是地址,因为SCTP端口号在通道的生命周期内保持不变。

      成功完成此方法后设置的新关联将与给定地址关联。向现有关联添加地址是可选功能。如果端点支持动态地址重新配置,则可能向对等方发送适当的消息以更改对等方的地址列表。

      参数:
      address - 要从套接字的绑定地址中删除的地址
      返回:
      此通道
      抛出:
      ClosedChannelException - 如果此通道已关闭
      NotYetBoundException - 如果此通道尚未绑定
      AlreadyBoundException - 如果此通道已绑定到给定地址
      IllegalArgumentException - 如果地址为null或为通配符地址
      IOException - 如果发生其他I/O错误
    • unbindAddress

      public abstract SctpMultiChannel unbindAddress(InetAddress address) throws IOException
      从通道套接字的绑定地址中删除给定地址。

      给定地址不能是通配符地址。在调用此方法之前,必须首先使用bind绑定通道,否则将抛出NotYetBoundException

      如果在没有address作为其绑定地址之一的通道上调用此方法,或者只有一个本地地址绑定到它,则此方法将抛出IllegalUnbindException

      使用bind绑定通道套接字的初始地址可能会从通道套接字的绑定地址中删除。

      成功完成此方法后设置的新关联将不与给定地址关联。从现有关联中删除地址是可选功能。如果端点支持动态地址重新配置,则可能向对等方发送适当的消息以更改对等方的地址列表。

      参数:
      address - 要从套接字的绑定地址中删除的地址
      返回:
      此通道
      抛出:
      ClosedChannelException - 如果此通道已关闭
      NotYetBoundException - 如果此通道尚未绑定
      IllegalUnbindException - address未绑定到通道的套接字,或通道只绑定了一个地址
      IllegalArgumentException - 如果地址为null或为通配符地址
      IOException - 如果发生其他I/O错误
    • getAllLocalAddresses

      public abstract Set<SocketAddress> getAllLocalAddresses() throws IOException
      返回此通道套接字绑定的所有套接字地址。
      返回:
      此通道套接字绑定的所有套接字地址,如果通道套接字未绑定,则返回空的Set
      抛出:
      ClosedChannelException - 如果通道已关闭
      IOException - 如果发生I/O错误
    • getRemoteAddresses

      public abstract Set<SocketAddress> getRemoteAddresses(Association association) throws IOException
      返回此通道套接字上给定关联连接的所有远程地址。
      参数:
      association - 关联
      返回:
      给定关联的所有远程地址,如果关联已关闭,则返回空的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 - 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

      public abstract Set<SctpSocketOption<?>> 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

      public abstract int send(ByteBuffer buffer, MessageInfo messageInfo) throws IOException
      通过此通道发送消息。

      如果此通道未绑定,则在发送任何数据之前,此方法将调用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

      public abstract SctpChannel branch(Association association) throws IOException
      分支出一个关联。

      应用程序可以调用此方法将关联分支到一个单独的通道中。将为关联创建新的绑定和连接的SctpChannel。分支出的关联将不再是此通道的一部分。

      当应用程序希望将许多零星消息发送者/接收者保留在原始SCTP多通道下,但将携带高容量数据流量的那些关联分支到自己独立的SCTP通道中时,这是特别有用的。

      参数:
      association - 要分支的关联
      返回:
      SctpChannel
      抛出:
      ClosedChannelException - 如果此通道已关闭
      IOException - 如果发生其他I/O错误