Module  jdk.sctp
软件包  com.sun.nio.sctp

Class SctpChannel

  • All Implemented Interfaces:
    CloseableAutoCloseableChannelInterruptibleChannel


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

    SCTP通道只能控制一个SCTP关联。 一个SCTPChannel被调用的一个创造open这个类的方法。 新创建的通道已打开但尚未连接,即与远程对等体没有关联设置。 尝试在未连接的通道上调用I / O操作将导致抛出NotYetConnectedException 可以通过使用其connect方法之一连接通道来设置关联。 一旦连接,通道保持连接,直到它被关闭。 通道是否连接可以通过调用getRemoteAddresses来确定。

    SCTP通道支持非阻塞连接:可以创建一个通道,并且可以通过connect方法启动建立到远程套接字的链接的过程,以便稍后通过finishConnect方法完成。 可以通过调用isConnectionPending方法来确定连接操作是否正在进行。

    套接字选项使用setOption方法进行配置。 SCTP通道支持以下选项:

    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通道可以安全使用多个并发线程。 他们支持并发阅读和写作,尽管最多只有一个线程可能正在读取,并且最多一个线程可能在任何给定的时间写入。 connectfinishConnect方法彼此相互同步,并且在调用这些方法之一的过程中尝试发起发送或接收操作将阻塞直到该调用完成。

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

      • SctpChannel

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

      • 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 - 如果地址是 nullwildcard地址
        IOException - 如果发生其他I / O错误
      • unbindAddress

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

        给定的地址不能是wildcard地址。 在调用此方法之前,必须首先使用bind绑定通道,否则抛出NotYetBoundException 如果在不具有address作为其绑定地址或仅具有一个本地地址的通道上调用此方法,则该方法将抛出IllegalUnbindException 通道的套接字使用bind绑定的初始地址可能会从通道套接字的绑定地址中删除。

        从连接的关联中删除地址是可选功能。 如果端点支持动态地址重新配置,那么它可以向对等体发送适当的消息来改变对等体地址列表。

        参数
        address - 从套接字的绑定地址中删除的地址
        结果
        这个频道
        异常
        ClosedChannelException - 如果此频道已关闭
        ConnectionPendingException - 如果此通道上已经在进行非阻塞连接操作
        NotYetBoundException - 如果此频道尚未绑定
        IllegalArgumentException - 如果地址是 nullwildcard地址
        IllegalUnbindException - 如果address未绑定到通道的插座。 或者通道只有一个地址被绑定
        IOException - 如果发生其他I / O错误
      • connect

        public abstract boolean connect​(SocketAddress remote)
                                 throws IOException
        连接此通道的插座。

        如果此通道处于非阻塞模式,则此方法的调用将启动非阻塞连接操作。 如果立即建立连接,就像本地连接一样,该方法返回true 否则,此方法返回false ,后来可以通过调用finishConnect方法完成连接操作。

        如果此通道处于阻塞模式,则该方法的调用将阻塞,直到建立连接或发生I / O错误。

        如果安装了一个安全管理器,则该方法验证其checkConnect方法是否允许连接给定远程对等体的地址和端口号。

        可以随时调用此方法。 如果在调用此方法时正在调用此频道上的sendreceive操作,则该操作将首先阻止,直到此调用完成。 如果连接尝试启动但失败,也就是说,如果此方法的调用抛出已检查的异常,则该通道将被关闭。

        参数
        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);
         

        maxOutStreamsmaxInStreams参数表示应用程序希望能够发送和接收的最大流数。 它们与远程对等体协商,并且可能受到操作系统的限制。

        参数
        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或抛出描述失败的已检查异常。

        可以随时调用此方法。 如果在调用此方法时正在调用此通道上的sendreceive操作,则该操作将首先阻止,直到此调用完成。 如果连接尝试失败,也就是说,如果此方法的调用引发已检查的异常,那么该通道将被关闭。

        结果
        true如果,且仅当此通道的套接字现在已连接
        异常
        NoConnectionPendingException - 如果该通道未连接,并且没有启动连接操作
        ClosedChannelException - 如果此通道关闭
        AsynchronousCloseException - 如果另一个线程在连接操作进行过程中关闭此通道
        ClosedByInterruptException - 如果另一个线程在连接操作进行过程中中断当前线程,从而关闭通道并设置当前线程的中断状态
        IOException - 如果发生其他I / O错误
      • getAllLocalAddresses

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

        public abstract Set<SocketAddress> getRemoteAddresses​()
                                                       throws IOException
        返回此通道的套接字所连接的所有远程地址。

        如果通道连接到绑定到多个地址的远程对等体,则这些地址是通道的插座连接的。

        结果
        所有与此通道的插座连接的远程地址,如果通道的插座未连接, SetSet
        异常
        ClosedChannelException - 如果通道关闭
        IOException - 如果发生I / O错误
      • shutdown

        public abstract SctpChannel shutdown​()
                                      throws IOException
        关闭连接而不关闭通道。

        向远程对等体发送shutdown命令,有效防止任何对等体将任何新数据写入套接字。 进一步发送将抛出ClosedChannelException 通道保持打开状态,以允许在接收到关闭命令之前接收对方可能发送的任何数据(和通知)。 如果通道已经关闭,则调用此方法没有任何作用。

        结果
        这个频道
        异常
        NotYetConnectedException - 如果此通道尚未连接
        ClosedChannelException - 如果此通道关闭
        IOException - 如果发生其他I / O错误
      • supportedOptions

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

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

        结果
        此通道支持的一组套接字选项
      • 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忽略任何通知。
        结果
        MessageInfonull如果此通道处于非阻塞模式和没有消息可立即或通知处理程序返回 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错误