所有类


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 方法创建数据报通道。新创建的数据报通道已打开,但尚未连接。为了使用 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
 
从接口 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 方法执行的安全检查完全相同。也就是说,如果已安装了安全管理器,则此方法验证其 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 错误

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部