模块  jdk.sctp
软件包  com.sun.nio.sctp

Class SctpMultiChannel

  • 实现的所有接口
    CloseableAutoCloseableChannelInterruptibleChannel

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

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

    可以在不明确建立与远程对等体的关联的情况下发送和接收消息。 如果没有与该对等体的关联,则每当它发送或接收来自远程对等体的消息时,该通道将隐式地建立新的关联。 成功建立关联后, association changed通知将被放入SCTP堆栈,其event参数设置为COMM_UP 可以通过调用receive来接收此通知。

    使用setOption方法配置套接字选项。 SctpMultiChannel支持以下选项:

    Socket options
    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多通道可安全地由多个并发线程使用。 它们支持并发发送和接收,但最多只有一个线程可以发送,并且最多一个线程可能在任何给定时间接收。

    从以下版本开始:
    1.7
    • 构造方法详细信息

      • SctpMultiChannel

        protected SctpMultiChannel​(SelectorProvider provider)
        初始化此类的新实例。
        参数
        provider - 此通道的选择器提供程序
    • 方法详细信息

      • 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错误
      • bindAddress

        public abstract SctpMultiChannel bindAddress​(InetAddress address)
                                              throws IOException
        将给定地址添加到通道套接字的绑定地址。

        给定地址不得为wildcard地址。 在调用此方法之前,必须首先使用bind绑定通道,否则抛出NotYetBoundException bind方法将SocketAddress作为其参数,通常包含端口号和地址。 使用此方法进行后续绑定的地址只是地址,因为SCTP端口号在通道的生命周期内保持不变。

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

        参数
        address - 要添加到套接字的绑定地址的地址
        结果
        这个频道
        异常
        ClosedChannelException - 如果此渠道已关闭
        NotYetBoundException - 如果此频道尚未绑定
        AlreadyBoundException - 如果此通道已绑定到给定地址
        IllegalArgumentException - 如果地址是 null或地址 wildcard
        IOException - 如果发生其他一些I / O错误
      • unbindAddress

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

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

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

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

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

        参数
        address - 要从套接字的绑定地址中删除的地址
        结果
        这个频道
        异常
        ClosedChannelException - 如果此频道已关闭
        NotYetBoundException - 如果此频道尚未绑定
        IllegalUnbindException - address未绑定到通道的套接字,或者通道只有一个绑定到它的地址
        IllegalArgumentException - 如果地址是 nullwildcard地址
        IOException - 如果发生其他一些I / O错误
      • getAllLocalAddresses

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

        public abstract Set<SocketAddress> getRemoteAddresses​(Association association)
                                                       throws IOException
        返回此通道套接字上给定关联所连接的所有远程地址。
        参数
        association - 协会
        结果
        给定关联的所有远程地址,如果关联已关闭, SetSet
        异常
        ClosedChannelException - 如果频道已关闭
        IOException - 如果发生I / O错误
      • getOption

        public abstract <T> T getOption​(SctpSocketOption<T> name,
                                        Association association)
                                 throws IOException
        返回套接字选项的值。

        请注意,某些选项是在通道的套接字上检索的,因此association参数不适用,如果给定,将被忽略。 但是,如果该选项是特定于关联的,则必须给出关联。

        参数类型
        T - 套接字选项值的类型
        参数
        name - 套接字选项
        association - 应检索其选项的关联,如果应在通道的套接字级别检索此选项, null
        结果
        套接字选项的值。 null可能是某些套接字选项的有效值。
        异常
        UnsupportedOperationException - 如果此通道不支持套接字选项
        ClosedChannelException - 如果此渠道已关闭
        IOException - 如果发生I / O错误
        另请参见:
        SctpStandardSocketOptions
      • setOption

        public abstract <T> SctpMultiChannel setOption​(SctpSocketOption<T> name,
                                                       T value,
                                                       Association association)
                                                throws IOException
        设置套接字选项的值。

        请注意,某些选项是在通道的套接字上检索的,因此association参数不适用,如果给定则将被忽略。 但是,如果该选项是特定于关联的,则必须给出关联。

        参数类型
        T - 套接字选项值的类型
        参数
        name - 套接字选项
        association - 应设置其选项的关联,如果应在通道的套接字级别设置此选项, null
        value - 套接字选项的值。 null可能是某些套接字选项的有效值。
        结果
        这个频道
        异常
        UnsupportedOperationException - 如果此通道不支持套接字选项
        IllegalArgumentException - 如果该值不是此套接字选项的有效值
        ClosedChannelException - 如果此渠道已关闭
        IOException - 如果发生I / O错误
        另请参见:
        SctpStandardSocketOptions
      • supportedOptions

        public abstract Set<SctpSocketOption<?>> supportedOptions()
        返回此通道支持的一组套接字选项。

        即使在关闭通道后,此方法仍将继续返回选项集。

        结果
        此通道支持的一组套接字选项
      • receive

        public abstract <T> MessageInfo receive​(ByteBuffer buffer,
                                                T attachment,
                                                NotificationHandler<T> handler)
                                         throws IOException
        通过此频道接收消息和/或处理通知。

        如果消息或通知立即可用,或者此通道处于阻止模式且最终可用,则分别返回或处理消息或通知。 如果此通道处于非阻塞模式且消息或通知未立即可用,则此方法立即返回null

        如果此方法收到消息,则将其复制到给定的字节缓冲区中,并返回MessageInfo 消息从当前位置开始传送到给定的字节缓冲区,缓冲区位置按读取的字节数递增。 如果缓冲区中剩余的字节数少于保存消息所需的字节数,或者底层输入缓冲区不包含完整消息,则返回的MessageInfo上的MessageInfo的调用将返回false ,并且此方法的更多调用将是必须完全消耗杂物。 一次只能在任何流中部分传递一条消息。 套接字选项SCTP_FRAGMENT_INTERLEAVE控制消息隔行扫描发生的各个方面。

        如果此方法收到通知,则调用给定处理程序的适当方法(如果有)。 如果处理程序返回CONTINUE则此方法将尝试接收另一个消息/通知,否则,如果返回RETURN则此方法将返回null 如果处理程序抛出未捕获的异常,它将通过此方法向上传播。

        如果已安装安全管理器,则对于每个新的关联设置,此方法将验证安全管理器的checkAccept方法是否允许关联源地址和端口号。

        可以随时调用此方法。 如果另一个线程已经在此通道上启动了接收操作,则此方法的调用将阻塞,直到第一个操作完成。 调用给定的处理程序而不保留用于强制执行上述同步策略的任何锁,这样处理程序不会阻止其他线程接收。 处理程序不应该调用此通道的receive方法, 否则将抛出IllegalReceiveException

        参数类型
        T - 附件的类型
        参数
        buffer - 要传输字节的缓冲区
        attachment - 要附加到接收操作的对象; 可以是null
        handler - 处理来自SCTP堆栈的通知的处理程序,或 null以忽略任何通知。
        结果
        MessageInfonull如果此通道处于非阻塞模式和没有消息可立即或通知处理程序返回 RETURN处理的通知后
        异常
        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中的地址标识),则将自动设置为预期的接收器。 这被认为是隐式关联设置。 成功建立关联后, association changed通知将被放入SCTP堆栈,其event参数设置为COMM_UP 可以通过调用receive来接收此通知。

        如果此通道处于阻塞模式,则底层输出缓冲区中有足够的空间,则给定字节缓冲区中的剩余字节将作为单个消息传输。 除非在此通道的套接字上启用了显式消息完成SCTP_EXPLICIT_COMPLETE套接字选项,否则发送消息是原子的。

        如果此通道处于非阻塞模式,则底层输出缓冲区中有足够的空间,并且需要隐式关联设置,然后给定字节缓冲区中的剩余字节作为单个消息传输,受制于SCTP_EXPLICIT_COMPLETE 如果由于任何原因无法传递消息, 则将association changed通知放在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错误