模块  java.base
软件包  java.nio.channels

Class DatagramChannel

    • 构造方法详细信息

      • DatagramChannel

        protected DatagramChannel​(SelectorProvider provider)
        初始化此类的新实例。
        参数
        provider - 创建此频道的提供商
    • 方法详细信息

      • open

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

        通过调用系统范围的默认SelectorProvider对象的openDatagramChannel方法创建新通道。 频道将无法连接。

        通道套接字的ProtocolFamily依赖于平台(可能是配置),因此未指定。 open允许在打开数据报通道时选择协议族,并且应该用于打开用于Internet协议多播的数据报通道。

        结果
        一个新的数据报通道
        异常
        IOException - 如果发生I / O错误
      • socket

        public abstract DatagramSocket socket()
        检索与此通道关联的数据报套接字。

        返回的对象不会声明未在DatagramSocket类中声明的任何公共方法。

        结果
        与此通道关联的数据报套接字
      • isConnected

        public abstract boolean isConnected()
        判断此通道的插座是否已连接。
        结果
        true当且仅当此频道的套接字是 open且已连接
      • connect

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

        配置通道的套接字,使其仅从给定的远程对等地址接收数据报,并将数据报发送到给定的远程对等地址。 连接后,可能无法从任何其他地址接收或发送数据报。 数据报套接字保持连接,直到明确断开连接或关闭为止。

        此方法执行与DatagramSocket类的connect方法完全相同的安全检查。 也就是说,如果安装了安全管理器,则此方法将验证其checkAcceptcheckConnect方法是否允许分别从给定的远程地址接收和发送数据报。

        可以随时调用此方法。 它对调用它时正在进行的读或写操作没有任何影响。 如果此通道的套接字未绑定,则此方法将首先使套接字绑定到自动分配的地址,就像调用参数为nullbind方法null

        参数
        remote - 此通道要连接的远程地址
        结果
        这个数据报通道
        异常
        AlreadyConnectedException - 如果此通道已连接
        ClosedChannelException - 如果此渠道已关闭
        AsynchronousCloseException - 如果另一个线程在连接操作正在进行时关闭此通道
        ClosedByInterruptException - 如果另一个线程在连接操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态
        UnresolvedAddressException - 如果给定的远程地址未完全解析
        UnsupportedAddressTypeException - 如果不支持给定远程地址的类型
        SecurityException - 如果已安装安全管理器且不允许访问给定的远程地址
        IOException - 如果发生其他一些I / O错误
      • disconnect

        public abstract DatagramChannel disconnect()
                                            throws 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操作一样。 如果缓冲区中剩余的字节数少于保存数据报所需的字节数,则静默丢弃数据报的其余部分。

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

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

        参数
        dst - dst数据报传输到的缓冲区
        结果
        数据报的源地址,如果此通道处于非阻塞模式且没有数据报立即可用, null
        异常
        ClosedChannelException - 如果此频道已关闭
        AsynchronousCloseException - 如果另一个线程在读操作正在进行时关闭此通道
        ClosedByInterruptException - 如果另一个线程在读操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态
        SecurityException - 如果已安装安全管理器且不允许从数据报的发送方接受数据报
        IOException - 如果发生其他一些I / O错误
      • send

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

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

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

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

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

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

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

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

        Specified by:
        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接口中指定的完全相同

        Specified by:
        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接口中指定的完全相同

        Specified by:
        read在界面 ScatteringByteChannel
        参数
        dsts - 要传输字节的缓冲区
        结果
        读取的字节数,可能为零,如果通道已到达流末尾, -1
        异常
        NotYetConnectedException - 如果未连接此通道的插槽
        ClosedChannelException - 如果此渠道已关闭
        AsynchronousCloseException - 如果另一个线程在读取操作正在进行时关闭此通道
        ClosedByInterruptException - 如果另一个线程在读操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态
        IOException - 如果发生其他一些I / O错误
      • write

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

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

        Specified by:
        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接口中指定的完全相同

        Specified by:
        write在界面 GatheringByteChannel
        参数
        srcs - 要从中检索字节的缓冲区
        结果
        发送的字节数,可以是调用此方法时源缓冲区中剩余的字节数,或者,如果此通道是非阻塞的,如果底层数据报的空间不足,则可能为零输出缓冲区
        异常
        NotYetConnectedException - 如果未连接此通道的套接字
        ClosedChannelException - 如果此渠道已关闭
        AsynchronousCloseException - 如果另一个线程在写操作正在进行时关闭此通道
        ClosedByInterruptException - 如果另一个线程在写操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态
        IOException - 如果发生其他一些I / O错误
      • getLocalAddress

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

        如果通道是bound到Internet协议套接字地址,则此方法的返回值是InetSocketAddress类型。

        如果存在安全管理器集,则使用本地地址和-1作为其参数调用其checkConnect方法,以查看是否允许该操作。 如果不允许该操作,则SocketAddress表示loopback地址的SocketAddress和通道套接字的本地端口。

        Specified by:
        getLocalAddress在界面 NetworkChannel
        结果
        SocketAddress这套接字绑定到,或 SocketAddress代表的环回地址,如果安全管理器拒绝,或 null如果通道的套接字不绑定
        异常
        ClosedChannelException - 如果频道已关闭
        IOException - 如果发生I / O错误