Module java.base

Class DatagramChannel

所有已实现的接口:
Closeable, AutoCloseable, ByteChannel, Channel, GatheringByteChannel, InterruptibleChannel, MulticastChannel, NetworkChannel, ReadableByteChannel, ScatteringByteChannel, WritableByteChannel

public abstract class DatagramChannel extends AbstractSelectableChannel implements ByteChannel, ScatteringByteChannel, GatheringByteChannel, MulticastChannel
用于数据报导向套接字的可选择通道。

通过调用此类的一个open方法来创建数据报通道。不可能为任意预先存在的数据报套接字创建通道。新创建的数据报通道是打开的但未连接的。数据报通道不需要连接即可使用sendreceive方法。数据报通道可以通过调用其connect方法进行连接,以避免作为每次发送和接收操作的一部分执行的安全检查开销。数据报通道必须连接才能使用readwrite方法,因为这些方法不接受或返回套接字地址。

一旦连接,数据报通道保持连接直到断开连接或关闭。可以通过调用其isConnected方法来确定数据报通道是否连接。

使用setOption方法配置套接字选项。Internet协议套接字的数据报通道支持以下选项:

套接字选项
选项名称 描述
SO_SNDBUF 套接字发送缓冲区的大小
SO_RCVBUF 套接字接收缓冲区的大小
SO_REUSEADDR 重用地址
SO_BROADCAST 允许广播数据报的传输
IP_TOS 互联网协议(IP)头部中的服务类型(ToS)字节
IP_MULTICAST_IF 互联网协议(IP)多播数据报的网络接口
IP_MULTICAST_TTL 互联网协议(IP)多播数据报的生存时间
IP_MULTICAST_LOOP 互联网协议(IP)多播数据报的环回
还可能支持其他(特定于实现的)选项。

数据报通道可安全用于多个并发线程。它们支持并发读写,尽管在任何给定时间最多只能有一个线程在读取,最多只能有一个线程在写入。

自:
1.4
  • Constructor Details

    • DatagramChannel

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

    • open

      public static DatagramChannel open() throws IOException
      打开数据报通道。

      通过调用系统范围默认的openDatagramChannel方法创建新通道。该通道不会连接。

      通道的套接字的ProtocolFamily是平台(可能还取决于配置)相关的,因此未指定。当打开用于Internet协议多播的数据报通道时,应使用open来选择协议族,并且应该用于打开用于Internet协议多播的数据报通道。

      返回:
      一个新的数据报通道
      抛出:
      IOException - 如果发生I/O错误
      参见:
    • open

      public static DatagramChannel open(ProtocolFamily family) throws IOException
      打开数据报通道。

      family参数用于指定ProtocolFamily。如果数据报通道用于IP多播,则应与此通道将加入的多播组的地址类型对应。

      通过调用系统范围默认的openDatagramChannel方法创建新通道。该通道不会连接。

      API注释:
      不支持Unix域套接字。
      参数:
      family - 协议族
      返回:
      一个新的数据报通道
      抛出:
      UnsupportedOperationException - 如果不支持指定的协议族。例如,假设参数指定为StandardProtocolFamily.INET6,但平台上未启用IPv6。
      IOException - 如果发生I/O错误
      自:
      1.7
      参见:
    • validOps

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

      数据报通道支持读取和写入,因此此方法返回(SelectionKey.OP_READ | SelectionKey.OP_WRITE)

      在类中指定:
      validOps in class SelectableChannel
      返回:
      有效操作集
    • bind

      public abstract DatagramChannel bind(SocketAddress local) throws IOException
      从接口中复制的描述: NetworkChannel
      将通道的套接字绑定到本地地址。

      此方法用于在套接字和本地地址之间建立关联。一旦建立关联,套接字将保持绑定直到通道关闭。如果local参数的值为null,则套接字将绑定到自动分配的地址。

      指定者:
      bind 在接口 NetworkChannel
      参数:
      local - 要绑定套接字的地址,或者null以将套接字绑定到自动分配的套接字地址
      返回值:
      此通道
      抛出:
      AlreadyBoundException - 如果套接字已经绑定
      UnsupportedAddressTypeException - 如果给定地址的类型不受支持
      ClosedChannelException - 如果通道已关闭
      IOException - 如果发生其他I/O错误
      SecurityException - 如果已安装安全管理器并且其checkListen方法拒绝操作
      自从:
      1.7
      参见:
    • setOption

      public abstract <T> DatagramChannel setOption(SocketOption<T> name, T value) throws IOException
      从接口复制的描述: NetworkChannel
      设置套接字选项的值。
      指定者:
      setOption 在接口 NetworkChannel
      类型参数:
      T - 套接字选项值的类型
      参数:
      name - 套接字选项
      value - 套接字选项的值。对于某些套接字选项,null可能是有效值。
      返回值:
      此通道
      抛出:
      UnsupportedOperationException - 如果此通道不支持套接字选项
      IllegalArgumentException - 如果值不是此套接字选项的有效值
      ClosedChannelException - 如果此通道已关闭
      IOException - 如果发生I/O错误
      自从:
      1.7
      参见:
    • socket

      public abstract DatagramSocket socket()
      检索与此通道关联的数据报套接字。
      返回值:
      与此通道关联的数据报套接字
    • isConnected

      public abstract boolean isConnected()
      告知此通道的套接字是否已连接。
      返回值:
      如果且仅当此通道的套接字open且已连接时为true
    • connect

      public abstract DatagramChannel connect(SocketAddress remote) throws IOException
      连接此通道的套接字。

      配置通道的套接字,以便仅从给定的远程对等地址接收数据报,并向该地址发送数据报。一旦连接,就不能从任何其他地址接收或发送数据报。在调用此方法之前未接收的通道的套接字接收缓冲区中的数据报可能会被丢弃。通道的套接字保持连接状态,直到显式断开连接或关闭为止。

      此方法执行与connect方法相同的安全检查,即如果已安装安全管理器,则此方法验证其checkAcceptcheckConnect方法是否允许从给定的远程地址接收和发送数据报。一旦连接,将不再为从给定的远程地址接收或发送的数据报执行进一步的安全检查。应注意确保连接的数据报通道不与不受信任的代码共享。

      此方法可以随时调用。如果另一个线程已经启动了对此通道的读取或写入操作,则调用此方法将阻塞,直到任何此类操作完成。如果此通道的套接字未绑定,则此方法将首先导致套接字绑定到自动分配的地址,就好像使用null参数调用bind方法一样。

      参数:
      remote - 要连接此通道的远程地址
      返回值:
      此数据报通道
      抛出:
      AlreadyConnectedException - 如果此通道已连接
      ClosedChannelException - 如果此通道已关闭
      AsynchronousCloseException - 如果另一个线程在连接操作进行中关闭此通道
      ClosedByInterruptException - 如果另一个线程在连接操作进行中中断当前线程,从而关闭通道并设置当前线程的中断状态
      UnresolvedAddressException - 如果给定的远程地址未完全解析
      UnsupportedAddressTypeException - 如果给定的远程地址的类型不受支持
      SecurityException - 如果已安装安全管理器并且不允许访问给定的远程地址,或者如果未绑定,则安全管理器的checkListen方法拒绝操作
      IOException - 如果发生其他I/O错误
    • disconnect

      public abstract DatagramChannel disconnect() throws IOException
      断开此通道的套接字。

      配置通道的套接字,以便只要安全管理器(如果已安装)允许,就可以从任何远程地址接收数据报并向其发送数据报。

      此方法可以随时调用。如果另一个线程已经启动了对此通道的读取或写入操作,则调用此方法将阻塞,直到任何此类操作完成。

      如果此通道的套接字未连接,或者通道已关闭,则调用此方法不会产生任何效果。

      API注释:
      如果此方法抛出IOException,则通道的套接字可能处于未指定状态。强烈建议在断开连接失败时关闭通道。
      返回值:
      此数据报通道
      抛出:
      IOException - 如果发生其他I/O错误
    • getRemoteAddress

      public abstract SocketAddress getRemoteAddress() throws IOException
      返回此通道的套接字连接的远程地址。
      返回值:
      远程地址;如果通道的套接字未连接,则为null
      抛出:
      ClosedChannelException - 如果通道已关闭
      IOException - 如果发生I/O错误
      自从:
      1.7
    • receive

      public abstract SocketAddress receive(ByteBuffer dst) throws IOException
      通过此通道接收数据报。

      如果立即可用数据报,或者如果此通道处于阻塞模式并且最终会有数据报可用,则将数据报复制到给定的字节缓冲区中,并返回其源地址。如果此通道处于非阻塞模式且数据报不立即可用,则此方法立即返回null

      数据报从其当前位置开始传输到给定的字节缓冲区,就像通过常规的read操作一样。如果缓冲区中剩余的字节数少于所需的数据报,则其余部分将被静默丢弃。

      此方法执行与receive方法相同的安全检查,即如果套接字未连接到特定远程地址并且已安装安全管理器,则对于每个接收到的数据报,此方法验证源地址和端口号是否被安全管理器的checkAccept方法允许。未经安全管理器允许的数据报将被静默丢弃。可以通过首先通过connect方法连接套接字来避免此安全检查的开销。

      此方法可以随时调用。但是,如果另一个线程已经启动了对此通道的读取操作,则调用此方法将阻塞,直到第一个操作完成。如果此通道的套接字未绑定,则此方法将首先导致套接字绑定到自动分配的地址,就好像使用null参数调用bind方法一样。

      参数:
      dst - 要传输数据报的缓冲区
      返回:
      数据报的源地址,如果通道处于非阻塞模式且没有立即可用的数据报,则返回null
      抛出:
      IllegalArgumentException - 如果缓冲区是只读的
      ClosedChannelException - 如果通道已关闭
      AsynchronousCloseException - 如果另一个线程在读取操作进行中关闭了此通道
      ClosedByInterruptException - 如果另一个线程在读取操作进行中中断了当前线程,从而关闭了通道并设置了当前线程的中断状态
      SecurityException - 如果未绑定,并且已安装安全管理器且其checkListen方法拒绝操作
      IOException - 如果发生其他I/O错误
    • send

      public abstract int send(ByteBuffer src, SocketAddress target) throws IOException
      通过此通道发送数据报。

      如果通道处于非阻塞模式且底层输出缓冲区有足够的空间,或者如果通道处于阻塞模式且有足够的空间可用,则给定缓冲区中剩余的字节将作为单个数据报传输到给定的目标地址。

      数据报从字节缓冲区传输,就像通过常规的write操作一样。

      此方法执行与DatagramSocket类的send方法完全相同的安全检查。也就是说,如果套接字未连接到特定远程地址并且已安装安全管理器,则对于每个发送的数据报,此方法会验证安全管理器的checkConnect方法是否允许目标地址和端口号。通过首先通过connect方法连接套接字可以避免此安全检查的开销。

      此方法可以随时调用。但是,如果另一个线程已经启动了对此通道的写操作,则此方法的调用将阻塞,直到第一个操作完成。如果此通道的套接字未绑定,则此方法将首先导致套接字绑定到自动分配的地址,就像通过使用参数null调用bind方法一样。

      参数:
      src - 要发送的数据报的缓冲区
      target - 要发送数据报的地址
      返回:
      发送的字节数,可能是调用此方法时源缓冲区中剩余的字节数,或者如果此通道是非阻塞的,则在底层输出缓冲区中没有足够空间来容纳数据报时可能为零
      抛出:
      AlreadyConnectedException - 如果此通道连接到与target指定的不同地址
      ClosedChannelException - 如果通道已关闭
      AsynchronousCloseException - 如果另一个线程在读取操作进行中关闭了此通道
      ClosedByInterruptException - 如果另一个线程在读取操作进行中中断了当前线程,从而关闭了通道并设置了当前线程的中断状态
      UnresolvedAddressException - 如果给定的远程地址未完全解析
      UnsupportedAddressTypeException - 如果给定的远程地址类型不受支持
      SecurityException - 如果已安装安全管理器且不允许将数据报发送到给定地址,或者未绑定,并且安全管理器的checkListen方法拒绝操作
      IOException - 如果发生其他I/O错误
    • read

      public abstract int read(ByteBuffer dst) throws IOException
      从此通道读取数据报。

      只有在此通道的套接字已连接且仅接受来自套接字对等方的数据报时才能调用此方法。如果数据报中的字节数多于给定缓冲区中剩余的字节数,则数据报的其余部分将被静默丢弃。否则,此方法的行为与ReadableByteChannel接口中指定的完全相同。

      指定者:
      read 在接口 ReadableByteChannel
      参数:
      dst - 要传输字节的缓冲区
      返回:
      读取的字节数,可能为零,或者如果通道已到达流的末尾,则为-1
      抛出:
      NotYetConnectedException - 如果此通道的套接字未连接
      ClosedChannelException - 如果通道已关闭
      AsynchronousCloseException - 如果另一个线程在读取操作进行中关闭了此通道
      ClosedByInterruptException - 如果另一个线程在读取操作进行中中断了当前线程,从而关闭了通道并设置了当前线程的中断状态
      IOException - 如果发生其他I/O错误
    • read

      public abstract long read(ByteBuffer[] dsts, int offset, int length) throws IOException
      从此通道读取数据报。

      只有在此通道的套接字已连接且仅接受来自套接字对等方的数据报时才能调用此方法。如果数据报中的字节数多于给定缓冲区中剩余的字节数,则数据报的其余部分将被静默丢弃。否则,此方法的行为与ScatteringByteChannel接口中指定的完全相同。

      指定者:
      read 在接口 ScatteringByteChannel
      参数:
      dsts - 要传输字节的缓冲区
      offset - 第一个要传输字节的缓冲区在缓冲区数组中的偏移量;必须是非负数且不大于dsts.length
      length - 要访问的最大缓冲区数;必须是非负数且不大于dsts.length - offset
      返回:
      读取的字节数,可能为零,或者如果通道已到达流的末尾,则为-1
      抛出:
      NotYetConnectedException - 如果此通道的套接字未连接
      ClosedChannelException - 如果通道已关闭
      AsynchronousCloseException - 如果另一个线程在读取操作进行中关闭了此通道
      ClosedByInterruptException - 如果另一个线程在读取操作进行中中断了当前线程,从而关闭了通道并设置了当前线程的中断状态
      IOException - 如果发生其他I/O错误
    • read

      public final long read(ByteBuffer[] dsts) throws IOException
      从此通道读取数据报。

      只有在此通道的套接字已连接且仅接受来自套接字对等方的数据报时才能调用此方法。如果数据报中的字节数多于给定缓冲区中剩余的字节数,则数据报的其余部分将被静默丢弃。否则,此方法的行为与ScatteringByteChannel接口中指定的完全相同。

      指定由:
      read 在接口 ScatteringByteChannel
      参数:
      dsts - 要传输字节的缓冲区
      返回:
      读取的字节数,可能为零,或者如果通道已到达流的末尾,则为-1
      抛出:
      NotYetConnectedException - 如果此通道的套接字未连接
      ClosedChannelException - 如果此通道已关闭
      AsynchronousCloseException - 如果另一个线程在读取操作进行中关闭此通道
      ClosedByInterruptException - 如果另一个线程在读取操作进行中中断当前线程,从而关闭通道并设置当前线程的中断状态
      IOException - 如果发生其他I/O错误
    • write

      public abstract int write(ByteBuffer src) throws IOException
      向此通道写入数据报。

      只有在此通道的套接字已连接时才能调用此方法,在这种情况下,它会直接将数据报发送到套接字的对等方。否则,它的行为与WritableByteChannel接口中指定的完全相同。

      指定由:
      write 在接口 WritableByteChannel
      参数:
      src - 要检索字节的缓冲区
      返回:
      写入的字节数,可能为零
      抛出:
      NotYetConnectedException - 如果此通道的套接字未连接
      ClosedChannelException - 如果此通道已关闭
      AsynchronousCloseException - 如果另一个线程在写入操作进行中关闭此通道
      ClosedByInterruptException - 如果另一个线程在写入操作进行中中断当前线程,从而关闭通道并设置当前线程的中断状态
      IOException - 如果发生其他I/O错误
    • write

      public abstract long write(ByteBuffer[] srcs, int offset, int length) throws IOException
      向此通道写入数据报。

      只有在此通道的套接字已连接时才能调用此方法,在这种情况下,它会直接将数据报发送到套接字的对等方。否则,它的行为与GatheringByteChannel接口中指定的完全相同。

      指定由:
      write 在接口 GatheringByteChannel
      参数:
      srcs - 要检索字节的缓冲区
      offset - 要从中检索字节的第一个缓冲区在缓冲区数组中的偏移量;必须是非负的且不大于srcs.length
      length - 要访问的最大缓冲区数;必须是非负的且不大于srcs.length - offset
      返回:
      发送的字节数,将是在调用此方法时源缓冲区中剩余的字节数,或者如果此通道是非阻塞的,则在底层输出缓冲区中没有足够空间放置数据报时可能为零
      抛出:
      NotYetConnectedException - 如果此通道的套接字未连接
      ClosedChannelException - 如果此通道已关闭
      AsynchronousCloseException - 如果另一个线程在写入操作进行中关闭此通道
      ClosedByInterruptException - 如果另一个线程在写入操作进行中中断当前线程,从而关闭通道并设置当前线程的中断状态
      IOException - 如果发生其他I/O错误
    • write

      public final long write(ByteBuffer[] srcs) throws IOException
      向此通道写入数据报。

      只有在此通道的套接字已连接时才能调用此方法,在这种情况下,它会直接将数据报发送到套接字的对等方。否则,它的行为与GatheringByteChannel接口中指定的完全相同。

      指定由:
      write 在接口 GatheringByteChannel
      参数:
      srcs - 要检索字节的缓冲区
      返回:
      发送的字节数,将是在调用此方法时源缓冲区中剩余的字节数,或者如果此通道是非阻塞的,则在底层输出缓冲区中没有足够空间放置数据报时可能为零
      抛出:
      NotYetConnectedException - 如果此通道的套接字未连接
      ClosedChannelException - 如果此通道已关闭
      AsynchronousCloseException - 如果另一个线程在写入操作进行中关闭此通道
      ClosedByInterruptException - 如果另一个线程在写入操作进行中中断当前线程,从而关闭通道并设置当前线程的中断状态
      IOException - 如果发生其他I/O错误
    • getLocalAddress

      public abstract SocketAddress getLocalAddress() throws IOException
      返回此通道的套接字绑定到的套接字地址。

      如果通道绑定到互联网协议套接字地址,则此方法的返回值是InetSocketAddress类型。

      如果设置了安全管理器,则将使用其checkConnect方法,以本地地址和-1作为参数来查看操作是否被允许。如果不允许该操作,则返回代表环回地址和通道套接字的本地端口的SocketAddress

      指定由:
      getLocalAddress 在接口 NetworkChannel
      返回:
      套接字绑定到的SocketAddress,如果安全管理器拒绝,则为代表环回地址的SocketAddress,如果通道的套接字未绑定则为null
      抛出:
      ClosedChannelException - 如果通道已关闭
      IOException - 如果发生I/O错误