java.lang.Object java.nio.channels.spi.AbstractInterruptibleChannel java.nio.channels.SelectableChannel java.nio.channels.spi.AbstractSelectableChannel java.nio.channels.DatagramChannel
public abstract class DatagramChannel
针对面向数据报套接字的可选择通道。
数据报通道不是网络数据报套接字的完整抽象。必须通过调用 socket
所获得的关联 DatagramSocket
对象来完成套接字选项的绑定和操作。不可能为任意的已有数据报套接字创建通道,也不可能指定与数据报通道关联的数据报套接字所使用的 DatagramSocketImpl
对象。
通过调用此类的 open
方法创建数据报通道。新创建的数据报通道已打开,但尚未连接。为了使用 send
和 receive
方法,无需连接数据报通道。但是如果为了避免作为每次发送和接收操作的一部分而执行的安全检查开销,也可以通过调用数据报通道的 connect
方法来建立数据报通道连接。为了使用 read
和 write
方法,必须建立数据报通道连接,因为这些方法不接受或返回套接字地址。
一旦建立了连接,在断开数据报通道的连接或将其关闭之前,该数据报通道保持连接状态。可通过调用数据报通道的 isConnected
方法来确定它是否已连接。
多个并发线程可安全地使用数据报通道。尽管在任意给定时刻最多只能有一个线程进行读取和写入操作,但数据报通道支持并发的读写。
构造方法摘要 | |
---|---|
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 |
构造方法详细信息 |
---|
protected DatagramChannel(SelectorProvider provider)
方法详细信息 |
---|
public static DatagramChannel open() throws IOException
通过调用系统级默认 SelectorProvider
对象的 openDatagramChannel
方法来创建新的通道。该通道不会被连接。
IOException
- 如果发生 I/O 错误
public final int validOps()
数据报通道支持读取和写入操作,所以此方法返回 (SelectionKey.OP_READ
| SelectionKey.OP_WRITE
)。
SelectableChannel
中的
validOps
public abstract DatagramSocket socket()
返回的对象不会声明任何在 DatagramSocket
类中未声明的公共方法。
public abstract boolean isConnected()
public abstract DatagramChannel connect(SocketAddress remote) throws IOException
配置该通道的套接字,以便该套接字仅和给定的远程同位体 地址进行数据报的接收和发送。一旦连接后,就无法和任何其他地址进行数据报的接收或发送。在显式地断开数据报套接字的连接或将其关闭之前,该套接字始终保持连接状态。
此方法执行的安全检查与 DatagramSocket
类的 connect
方法执行的安全检查完全相同。也就是说,如果已安装了安全管理器,则此方法验证其 checkAccept
和 checkConnect
方法是否分别允许接收来自给定远程地址的数据报和向其发送数据报。
可在任意时间调用此方法。此方法对调用它时正在进行的读取或写入操作没有任何影响。
remote
- 与此通道连接的远程地址
ClosedChannelException
- 如果此通道已关闭
AsynchronousCloseException
- 如果正在进行连接操作时另一个线程关闭了此通道
ClosedByInterruptException
- 如果正在进行连接操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程设置为中断状态
SecurityException
- 如果已安装安全管理器并且它不允许对给定远程地址进行访问
IOException
- 如果发生其他 I/O 错误
public abstract DatagramChannel disconnect() throws IOException
配置该通道的套接字,只要安全管理器允许(如果已安装),该套接字就可和任何远程地址进行数据报的接收和发送。
可在任意时间调用此方法。此方法对调用它时正在进行的读取或写入操作没有任何影响。
如果未连接此通道的套接字,或者通道已关闭,则调用此方法无效。
IOException
- 如果发生其他 I/O 错误
public abstract SocketAddress receive(ByteBuffer dst) throws IOException
如果数据报直接可用,并且此通道处于阻塞模式但最终会变得可用,则将数据报复制到给定的字节缓冲区中并返回数据报的源地址。如果此通道处于非阻塞模式并且没有直接可用的数据报,则此方法直接返回 null。
该数据报被传输到给定的字节缓冲区中,并从缓冲区的当前位置开始存储,如同正规的 read
操作一样。如果缓冲区中的剩余字节空间小于保存数据报所需的空间,则丢弃余下的数据报。
此方法执行的安全检查与 DatagramSocket
类的 receive
方法执行的安全检查完全相同。也就是说,如果该套接字未连接到特定的远程地址,并且已安装了安全管理器,则对于接收到的每个数据报,此方法都会验证安全管理器的 checkAccept
方法是否允许使用该数据报的源地址和端口号。避免此项安全检查开销的方法是首先通过 connect
方法连接该套接字。
可在任意时间调用此方法。但是如果另一个线程已经在此通道上发起了一个读取操作,则在该操作完成前此方法的调用被阻塞。
dst
- 要向其中传输数据报的缓冲区
ClosedChannelException
- 如果此通道已关闭
AsynchronousCloseException
- 如果正在进行读取操作时另一个线程关闭了此通道
ClosedByInterruptException
- 如果正在进行读取操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程设置为中断状态
SecurityException
- 如果已安装安全管理器并且它不允许接受该数据报发送者所发送的数据报
IOException
- 如果发生其他 I/O 错误
public abstract int send(ByteBuffer src, SocketAddress target) throws IOException
如果此通道处于非阻塞模式并且底层输出缓冲区中没有足够的空间,或者如果此通道处于阻塞模式并且缓冲区中有足够的空间,则将给定缓冲区中的剩余字节以单个数据报的形式传送到给定的目标地址。
从字节缓冲区传输数据报如同通过正规的 write
操作一样。
此方法执行的安全检查与 DatagramSocket
类的 send
方法执行的安全检查完全相同。也就是说,如果该套接字未连接到指定的远程地址,并且已安装了安全管理器,则对于每个发送的数据报,此方法都会验证安全管理器的 checkConnect
方法是否允许使用该数据报的目标地址和端口号。避免此项安全检查开销的方法是首先通过 connect
方法连接该套接字。
可在任意时间调用此方法。但是如果另一个线程已经在此通道上发起了一个写入操作,则在该操作完成前此方法的调用被阻塞。
src
- 包含要发送的数据报的缓冲区
target
- 要将数据报发送到的地址
ClosedChannelException
- 如果此通道已关闭
AsynchronousCloseException
- 如果正在进行读取操作时另一个线程关闭了此通道
ClosedByInterruptException
- 如果正在进行读取操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程设置为中断状态
SecurityException
- 如果已安装安全管理器并且它不允许将数据报发送到给定地址
IOException
- 如果发生其他 I/O 错误
public abstract int read(ByteBuffer dst) throws IOException
仅在此通道的套接字已连接时才调用此方法,并且此方法仅接受来自该套接字同位体的数据报。如果数据报中的字节数大于给定缓冲区中的剩余空间,则丢弃余下的数据报。否则此方法的行为与 ReadableByteChannel
接口中指定的行为完全相同。
ReadableByteChannel
中的
read
dst
- 要向其中传输字节的缓冲区
NotYetConnectedException
- 如果未连接此通道的套接字
ClosedChannelException
- 如果此通道已关闭
AsynchronousCloseException
- 如果正在进行读取操作时另一个线程关闭了此通道
ClosedByInterruptException
- 如果正在进行读取操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程设置为中断状态
IOException
- 如果发生其他 I/O 错误
public abstract long read(ByteBuffer[] dsts, int offset, int length) throws IOException
仅在此通道的套接字已连接时才调用此方法,并且此方法仅接受来自该套接字同位体的数据报。如果数据报中的字节数大于给定缓冲区中的剩余空间,则丢弃余下的数据报。否则此方法的行为与 ScatteringByteChannel
接口中指定的行为完全相同。
ScatteringByteChannel
中的
read
dsts
- 要向其中传输字节的缓冲区
offset
- 第一个缓冲区(字节传输到该缓冲区中)在缓冲区数组中的偏移量;必须为非负数并且不能大于
dsts.length
length
- 要访问的最大缓冲区数;必须为非负数并且不能大于
dsts.length -
offset
NotYetConnectedException
- 如果未连接此通道的套接字
ClosedChannelException
- 如果此通道已关闭
AsynchronousCloseException
- 如果正在进行读取操作时另一个线程关闭了此通道
ClosedByInterruptException
- 如果正在进行读取操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程设置为中断状态
IOException
- 如果发生其他 I/O 错误
public final long read(ByteBuffer[] dsts) throws IOException
仅在此通道的套接字已连接时才调用此方法,并且此方法仅接受来自该套接字同位体的数据报。如果数据报中的字节数大于给定缓冲区中的剩余空间,则丢弃余下的数据报。否则此方法的行为与 ScatteringByteChannel
接口中指定的行为完全相同。
ScatteringByteChannel
中的
read
dsts
- 要向其中传输字节的缓冲区
NotYetConnectedException
- 如果未连接此通道的套接字
ClosedChannelException
- 如果此通道已关闭
AsynchronousCloseException
- 如果正在进行读取操作时另一个线程关闭了此通道
ClosedByInterruptException
- 如果正在进行读取操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程设置为中断状态
IOException
- 如果发生其他 I/O 错误
public abstract int write(ByteBuffer src) throws IOException
仅在此通道的套接字已连接时才调用此方法,在这种情况下,此方法将数据报直接发送到套接字的同位体。否则此方法的行为与 WritableByteChannel
接口中指定的行为完全相同。
WritableByteChannel
中的
write
src
- 要从中获取字节的缓冲区
NotYetConnectedException
- 如果未连接此通道的套接字
ClosedChannelException
- 如果此通道已关闭
AsynchronousCloseException
- 如果正在进行写入操作时另一个线程关闭了此通道
ClosedByInterruptException
- 如果正在进行写入操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程的状态设置为中断
IOException
- 如果发生其他 I/O 错误
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 错误
public final long write(ByteBuffer[] srcs) throws IOException
仅在此通道的套接字已连接时才调用此方法,在这种情况下,此方法将数据报直接发送到套接字的同位体。否则此方法的行为与 GatheringByteChannel
接口中指定的行为完全相同。
GatheringByteChannel
中的
write
NotYetConnectedException
- 如果未连接此通道的套接字
ClosedChannelException
- 如果此通道已关闭
AsynchronousCloseException
- 如果正在进行写入操作时另一个线程关闭了此通道
ClosedByInterruptException
- 如果正在进行写入操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程的状态设置为中断
IOException
- 如果发生其他 I/O 错误