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

Class SctpChannel

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

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

SCTP通道只能控制一个SCTP关联。通过调用此类的一个open方法来创建一个SCTPChannel。新创建的通道是打开的,但尚未连接,也就是说,尚未与远程对等方建立关联。在未连接的通道上调用I/O操作将导致抛出NotYetConnectedException。可以通过使用通道的一个connect方法来建立关联。一旦连接,通道保持连接状态直到关闭。可以通过调用getRemoteAddresses来确定通道是否连接。

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

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

套接字选项
选项名称 描述
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通道可安全用于多个并发线程。它们支持并发读写,尽管在任何给定时间最多只能有一个线程在读取,最多只能有一个线程在写入。connectfinishConnect方法在彼此之间是互斥同步的,而在进行这些方法调用时尝试启动发送或接收操作将会阻塞,直到该调用完成。

自Java版本:
1.7
  • Constructor Details

    • SctpChannel

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

    • 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 - 应用程序希望能够发送的流的数量。必须是非负数且不大于655360表示使用端点的默认值。
      maxInStreams - 应用程序准备支持的最大入站流数。必须是非负数且不大于655360表示使用端点的默认值。
      返回:
      连接到给定地址的新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绑定,因为它可能会被unbindAddress移除,但一旦此方法成功完成调用,通道的套接字将始终至少绑定一个本地地址。

      一旦通道的套接字成功绑定到特定地址(而非自动分配的地址),可以使用bindAddress绑定更多地址,或使用unbindAddress移除地址。

      参数:
      local - 要绑定套接字的本地地址,或者null以将套接字绑定到自动分配的套接字地址
      返回:
      此通道
      抛出:
      AlreadyConnectedException - 如果此通道已连接
      ClosedChannelException - 如果此通道已关闭
      ConnectionPendingException - 如果此通道上已经存在非阻塞连接操作
      AlreadyBoundException - 如果此通道已绑定
      UnsupportedAddressTypeException - 如果给定地址的类型不受支持
      IOException - 如果发生其他I/O错误
      SecurityException - 如果已安装安全管理器且其checkListen方法拒绝操作
    • bindAddress

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

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

      向已连接的关联添加地址是可选功能。如果端点支持动态地址重新配置,则可能向对等方发送适当的消息以更改对等方地址列表。

      参数:
      address - 要添加到套接字绑定地址的地址
      返回:
      此通道
      抛出:
      ClosedChannelException - 如果此通道已关闭
      ConnectionPendingException - 如果此通道上已经存在非阻塞连接操作
      NotYetBoundException - 如果此通道尚未绑定
      AlreadyBoundException - 如果此通道已绑定到给定地址
      IllegalArgumentException - 如果地址为null通配符地址
      IOException - 如果发生其他I/O错误
    • unbindAddress

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

      给定地址不能是通配符地址。在调用此方法之前,必须首先使用bind绑定通道,否则将抛出NotYetBoundException异常。如果在只有一个本地地址绑定到通道的情况下,对不具有address作为其绑定地址之一的通道调用此方法,或者只有一个本地地址绑定到通道的情况下,此方法将抛出IllegalUnbindException。使用bind方法绑定通道套接字的初始地址可能会从通道套接字的绑定地址中移除。

      从已连接的关联中移除地址是可选功能。如果端点支持动态地址重新配置,则可能向对等方发送适当的消息以更改对等方地址列表。

      参数:
      address - 要从套接字绑定地址中移除的地址
      返回:
      此通道
      抛出:
      ClosedChannelException - 如果此通道已关闭
      ConnectionPendingException - 如果此通道上已经存在非阻塞连接操作
      NotYetBoundException - 如果此通道尚未绑定
      IllegalArgumentException - 如果地址为null通配符地址
      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
      连接此通道的套接字。

      这是一个便利方法,等效于评估以下表达式:

       setOption(SctpStandardSocketOptions.SCTP_INIT_MAXSTREAMS, SctpStandardSocketOption.InitMaxStreams.create(maxInStreams, maxOutStreams))
        .connect(remote);
       

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

      参数:
      remote - 要连接到的远程对等体
      maxOutStreams - 必须是非负数且不大于 655360 表示使用端点的默认值。
      maxInStreams - 必须是非负数且不大于 655360 表示使用端点的默认值。
      返回:
      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
      返回此通道的套接字绑定到的所有套接字地址。
      返回:
      此通道的套接字绑定到的所有套接字地址,如果通道的套接字未绑定,则返回空的 Set
      抛出:
      ClosedChannelException - 如果通道已关闭
      IOException - 如果发生 I/O 错误
    • getRemoteAddresses

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

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

      返回:
      此通道的套接字连接到的所有远程地址,如果通道的套接字未连接,则返回空的 Set
      抛出:
      ClosedChannelException - 如果通道已关闭
      IOException - 如果发生 I/O 错误
    • shutdown

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

      向远程对等体发送关闭命令,有效地阻止任何对等体写入套接字的新数据。进一步的发送将抛出 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错误
      参见:
    • setOption

      public abstract <T> SctpChannel setOption(SctpSocketOption<T> name, T value) throws IOException
      设置套接字选项的值。
      类型参数:
      T - 套接字选项值的类型
      参数:
      name - 套接字选项
      value - 套接字选项的值。对于某些套接字选项,null可能是有效的值。
      返回:
      此通道
      抛出:
      UnsupportedOperationException - 如果此通道不支持该套接字选项
      IllegalArgumentException - 如果值对于此套接字选项无效
      ClosedChannelException - 如果此通道已关闭
      IOException - 如果发生I/O错误
      参见:
    • supportedOptions

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

      即使通道已关闭,此方法仍将返回选项集。

      返回:
      此通道支持的套接字选项集合
    • validOps

      public final int validOps()
      返回标识此通道支持的操作的操作集。

      SCTP通道支持连接、读取和写入,因此此方法返回(SelectionKey.OP_CONNECT | SelectionKey.OP_READ | SelectionKey.OP_WRITE)

      指定者:
      validOps 在类 SelectableChannel
      返回:
      有效操作集
    • receive

      public abstract <T> MessageInfo receive(ByteBuffer dst, T attachment, NotificationHandler<T> handler) throws IOException
      接收给定缓冲区中的消息和/或处理通知。

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

      如果此方法接收到消息,则将其复制到给定的字节缓冲区中。消息将从当前位置开始传输到给定的字节缓冲区,并且缓冲区的位置将增加读取的字节数。如果缓冲区中剩余的字节数少于所需的消息大小,或者底层输入缓冲区不包含完整的消息,则在返回的 MessageInfo上调用isComplete,将返回false,并且需要更多次调用此方法才能完全消耗消息。在任何流中一次只会部分传递一个消息。套接字选项SCTP_FRAGMENT_INTERLEAVE控制消息交错的各个方面。

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

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

      类型参数:
      T - 附件的类型
      参数:
      dst - 要传输消息字节的缓冲区
      attachment - 要附加到接收操作的对象;可以是null
      handler - 用于处理来自SCTP堆栈的通知的处理程序,或null以忽略任何通知。
      返回:
      MessageInfo,如果此通道处于非阻塞模式且没有消息立即可用,或者通知处理程序在处理通知后返回RETURN,则返回null
      抛出:
      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错误