java.nio.channels

接口
异常
java.lang.Object
  继承者 java.nio.channels.spi.AbstractInterruptibleChannel
      继承者 java.nio.channels.SelectableChannel
          继承者 java.nio.channels.spi.AbstractSelectableChannel
              继承者 java.nio.channels.DatagramChannel
所有已实现的接口:
Closeable, ByteChannel, Channel, GatheringByteChannel, InterruptibleChannel, ReadableByteChannel, ScatteringByteChannel, WritableByteChannel

public abstract class DatagramChannel
     
extends AbstractSelectableChannel
implements ByteChannel, ScatteringByteChannel, GatheringByteChannel

针对面向数据报套接字的可选择通道。

数据报通道不是网络数据报套接字的完整抽象。必须通过调用 socket 所获得的关联 DatagramSocket 对象来完成套接字选项的绑定和操作。不可能为任意的已有数据报套接字创建通道,也不可能指定与数据报通道关联的数据报套接字所使用的 DatagramSocketImpl 对象。

通过调用此类的 open 方法创建数据报通道。新创建的数据报通道已打开,但尚未连接。为了使用 sendreceive 方法,无需连接数据报通道。但是如果为了避免作为每次发送和接收操作的一部分而执行的安全检查开销,也可以通过调用数据报通道的 connect 方法来建立数据报通道连接。为了使用 readwrite 方法,必须建立数据报通道连接,因为这些方法不接受或返回套接字地址。

一旦建立了连接,在断开数据报通道的连接或将其关闭之前,该数据报通道保持连接状态。可通过调用数据报通道的 isConnected 方法来确定它是否已连接。

多个并发线程可安全地使用数据报通道。尽管在任意给定时刻最多只能有一个线程进行读取和写入操作,但数据报通道支持并发的读写。

从以下版本开始:
1.4

构造方法摘要
protected DatagramChannel(SelectorProvider provider)
          初始化此类的一个新实例。
 
方法摘要
abstract  DatagramChannel connect(SocketAddress remote)
          连接此通道的套接字。
abstract  DatagramChannel disconnect()
          断开此通道套接字的连接。
abstract  boolean isConnected()
          判断是否已连接此通道的套接字。
static DatagramChannel open()
          打开数据报通道。
abstract  int read(ByteBuffer dst)
          从此通道读取数据报。
 long read(ByteBuffer[] dsts)
          从此通道读取数据报。
abstract  long read(ByteBuffer[] dsts, int offset, int length)
          从此通道读取数据报。
abstract  SocketAddress receive(ByteBuffer dst)
          通过此通道接收数据报。
abstract  int send(ByteBuffer src, SocketAddress target)
          通过此通道发送数据报。
abstract  DatagramSocket socket()
          获取与此通道关联的数据报套接字。
 int validOps()
          返回一个操作集,标识此通道所支持的操作。
abstract  int write(ByteBuffer src)
          将数据报写入此通道。
 long write(ByteBuffer[] srcs)
          将数据报写入此通道。
abstract  long write(ByteBuffer[] srcs, int offset, int length)
          将数据报写入此通道。
 
从类 java.nio.channels.spi.AbstractSelectableChannel 继承的方法
blockingLock, configureBlocking, implCloseChannel, implCloseSelectableChannel, implConfigureBlocking, isBlocking, isRegistered, keyFor, provider, register
 
从类 java.nio.channels.SelectableChannel 继承的方法
register
 
从类 java.nio.channels.spi.AbstractInterruptibleChannel 继承的方法
begin, close, end, isOpen
 
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
从接口 java.nio.channels.Channel 继承的方法
close, isOpen
 

构造方法详细信息

DatagramChannel

protected DatagramChannel(SelectorProvider provider)
初始化此类的一个新实例。

方法详细信息

open

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

通过调用系统级默认 SelectorProvider 对象的 openDatagramChannel 方法来创建新的通道。该通道不会被连接。

返回:
新的数据报通道
抛出:
IOException - 如果发生 I/O 错误

validOps

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

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

指定者:
SelectableChannel 中的 validOps
返回:
有效操作集

socket

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

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

返回:
与此通道关联的数据报套接字

isConnected

public abstract boolean isConnected()
判断是否已连接此通道的套接字。

返回:
当且仅当已连接此通道的套接字时才返回 true

connect

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

配置该通道的套接字,以便该套接字仅和给定的远程同位体 地址进行数据报的接收和发送。一旦连接后,就无法和任何其他地址进行数据报的接收或发送。在显式地断开数据报套接字的连接或将其关闭之前,该套接字始终保持连接状态。

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

可在任意时间调用此方法。此方法对调用它时正在进行的读取或写入操作没有任何影响。

参数:
remote - 与此通道连接的远程地址
返回:
此数据报通道
抛出:
ClosedChannelException - 如果此通道已关闭
AsynchronousCloseException - 如果正在进行连接操作时另一个线程关闭了此通道
ClosedByInterruptException - 如果正在进行连接操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程设置为中断状态
SecurityException - 如果已安装安全管理器并且它不允许对给定远程地址进行访问
IOException - 如果发生其他 I/O 错误

disconnect

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

配置该通道的套接字,只要安全管理器允许(如果已安装),该套接字就可和任何远程地址进行数据报的接收和发送。

可在任意时间调用此方法。此方法对调用它时正在进行的读取或写入操作没有任何影响。

如果未连接此通道的套接字,或者通道已关闭,则调用此方法无效。

返回:
此数据报通道
抛出:
IOException - 如果发生其他 I/O 错误

receive

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

如果数据报直接可用,并且此通道处于阻塞模式但最终会变得可用,则将数据报复制到给定的字节缓冲区中并返回数据报的源地址。如果此通道处于非阻塞模式并且没有直接可用的数据报,则此方法直接返回 null

该数据报被传输到给定的字节缓冲区中,并从缓冲区的当前位置开始存储,如同正规的 read 操作一样。如果缓冲区中的剩余字节空间小于保存数据报所需的空间,则丢弃余下的数据报。

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

可在任意时间调用此方法。但是如果另一个线程已经在此通道上发起了一个读取操作,则在该操作完成前此方法的调用被阻塞。

参数:
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 方法连接该套接字。

可在任意时间调用此方法。但是如果另一个线程已经在此通道上发起了一个写入操作,则在该操作完成前此方法的调用被阻塞。

参数:
src - 包含要发送的数据报的缓冲区
target - 要将数据报发送到的地址
返回:
发送的字节数,可能是调用此方法时源缓冲区中剩余的字节数,或者如果此通道处于非阻塞模式并且底层输出缓冲区中没有足够的空间供数据报使用,则可能为零
抛出:
ClosedChannelException - 如果此通道已关闭
AsynchronousCloseException - 如果正在进行读取操作时另一个线程关闭了此通道
ClosedByInterruptException - 如果正在进行读取操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程设置为中断状态
SecurityException - 如果已安装安全管理器并且它不允许将数据报发送到给定地址
IOException - 如果发生其他 I/O 错误

read

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

仅在此通道的套接字已连接时才调用此方法,并且此方法仅接受来自该套接字同位体的数据报。如果数据报中的字节数大于给定缓冲区中的剩余空间,则丢弃余下的数据报。否则此方法的行为与 ReadableByteChannel 接口中指定的行为完全相同。

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

read

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

仅在此通道的套接字已连接时才调用此方法,并且此方法仅接受来自该套接字同位体的数据报。如果数据报中的字节数大于给定缓冲区中的剩余空间,则丢弃余下的数据报。否则此方法的行为与 ScatteringByteChannel 接口中指定的行为完全相同。

指定者:
接口 ScatteringByteChannel 中的 read
参数:
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 接口中指定的行为完全相同。

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

write

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

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

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

write

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

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

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

write

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

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

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