模块 jdk.sctp

类 SctpChannel

所有已实现的接口:
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 通道支持以下选项:

套接字选项
选项名称 Description
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 通道可以安全地供多个并发线程使用。它们支持并发读取和写入,尽管在任何给定时间最多一个线程可能正在读取并且最多一个线程可能正在写入。 connect finishConnect 方法彼此相互同步,并且在调用其中一个方法时尝试启动发送或接收操作将被阻止,直到该调用完成。

自从:
1.7
  • 构造方法详细信息

    • 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 - 应用程序希望能够发送到的流的数量。必须为非负且不大于 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
      将给定地址添加到通道套接字的绑定地址。

      给定的地址不能是 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 方法是否允许连接到给定远程对等方的地址和端口号。

      可以随时调用此方法。如果在调用此方法时调用此通道上的 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
      连接此通道的套接字。

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

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

      可以随时调用此方法。如果在调用此方法时调用此通道上的 send receive 操作,则该操作将首先阻塞,直到此调用完成。如果连接尝试失败,即如果调用此方法抛出已检查的异常,则通道将关闭。

      返回:
      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 忽略任何通知。
      返回:
      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 操作一样。

      字节将写入给定 messageInfostreamNumber 指定的流编号。

      可以随时调用此方法。如果另一个线程已经在此通道上发起发送操作,则此方法的调用将阻塞,直到第一个操作完成。

      参数:
      src - 包含要发送的消息的缓冲区
      messageInfo - 有关要发送的消息的辅助数据
      返回:
      发送的字节数,这将是调用此方法时消息缓冲区中剩余的字节数,或者,如果此通道是非阻塞的,如果底层消息没有足够的空间,则可能为零输出缓冲器
      抛出:
      InvalidStreamException - 如果 streamNumner 为负数或大于或等于传出流的最大数量
      ClosedChannelException - 如果此通道关闭
      AsynchronousCloseException - 如果另一个线程在读取操作正在进行时关闭此通道
      ClosedByInterruptException - 如果另一个线程在读取操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态
      NotYetConnectedException - 如果此通道尚未连接
      IOException - 如果发生其他 I/O 错误