|
|||||||||
摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 |
java.nio.channels
类 DatagramChannel
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
方法创建数据报通道。新创建的数据报通道已打开,但尚未连接。为了使用 send
和 receive
方法,无需连接数据报通道。但是如果为了避免作为每次发送和接收操作的一部分而执行的安全检查开销,也可以通过调用数据报通道的 connect
方法来建立数据报通道连接。为了使用 read
和 write
方法,必须建立数据报通道连接,因为这些方法不接受或返回套接字地址。
一旦建立了连接,在断开数据报通道的连接或将其关闭之前,该数据报通道保持连接状态。可通过调用数据报通道的 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 |
从接口 java.nio.channels.Channel 继承的方法 |
---|
close, isOpen |
从接口 java.nio.channels.Channel 继承的方法 |
---|
close, isOpen |
从接口 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
方法执行的安全检查完全相同。也就是说,如果已安装了安全管理器,则此方法验证其checkAccept
和checkConnect
方法是否分别允许接收来自给定远程地址的数据报和向其发送数据报。可在任意时间调用此方法。此方法对调用它时正在进行的读取或写入操作没有任何影响。
-
-
- 参数:
-
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 错误