- 所有已实现的接口:
-
Closeable
,AutoCloseable
,ByteChannel
,Channel
,GatheringByteChannel
,InterruptibleChannel
,MulticastChannel
,NetworkChannel
,ReadableByteChannel
,ScatteringByteChannel
,WritableByteChannel
通过调用此类的一个open
方法来创建数据报通道。不可能为任意预先存在的数据报套接字创建通道。新创建的数据报通道是打开的但未连接的。数据报通道不需要连接即可使用send
和receive
方法。数据报通道可以通过调用其connect
方法进行连接,以避免作为每次发送和接收操作的一部分执行的安全检查开销。数据报通道必须连接才能使用read
和write
方法,因为这些方法不接受或返回套接字地址。
一旦连接,数据报通道保持连接直到断开连接或关闭。可以通过调用其isConnected
方法来确定数据报通道是否连接。
使用setOption
方法配置套接字选项。Internet协议套接字的数据报通道支持以下选项:
还可能支持其他(特定于实现的)选项。
选项名称 描述 SO_SNDBUF
套接字发送缓冲区的大小 SO_RCVBUF
套接字接收缓冲区的大小 SO_REUSEADDR
重用地址 SO_BROADCAST
允许广播数据报的传输 IP_TOS
互联网协议(IP)头部中的服务类型(ToS)字节 IP_MULTICAST_IF
互联网协议(IP)多播数据报的网络接口 IP_MULTICAST_TTL
互联网协议(IP)多播数据报的生存时间 IP_MULTICAST_LOOP
互联网协议(IP)多播数据报的环回
数据报通道可安全用于多个并发线程。它们支持并发读写,尽管在任何给定时间最多只能有一个线程在读取,最多只能有一个线程在写入。
- 自:
- 1.4
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionabstract DatagramChannel
bind
(SocketAddress local) 将通道的套接字绑定到本地地址。abstract DatagramChannel
connect
(SocketAddress remote) 连接此通道的套接字。abstract DatagramChannel
断开此通道的套接字。abstract SocketAddress
返回此通道的套接字绑定到的套接字地址。abstract SocketAddress
返回此通道的套接字连接到的远程地址。abstract boolean
告知此通道的套接字是否已连接。static DatagramChannel
open()
打开数据报通道。static DatagramChannel
open
(ProtocolFamily family) 打开数据报通道。abstract int
read
(ByteBuffer dst) 从此通道读取数据报。final 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 <T> DatagramChannel
setOption
(SocketOption<T> name, T value) 设置套接字选项的值。abstract DatagramSocket
socket()
检索与此通道关联的数据报套接字。final int
validOps()
返回标识此通道支持的操作的操作集。abstract int
write
(ByteBuffer src) 向此通道写入数据报。final long
write
(ByteBuffer[] srcs) 向此通道写入数据报。abstract long
write
(ByteBuffer[] srcs, int offset, int length) 向此通道写入数据报。Methods declared in class java.nio.channels.spi.AbstractSelectableChannel
blockingLock, configureBlocking, implCloseChannel, implCloseSelectableChannel, implConfigureBlocking, isBlocking, isRegistered, keyFor, provider, register
Methods declared in class java.nio.channels.SelectableChannel
register
Methods declared in class java.nio.channels.spi.AbstractInterruptibleChannel
begin, close, end, isOpen
Methods declared in class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods declared in interface java.nio.channels.MulticastChannel
close, join, join
Methods declared in interface java.nio.channels.NetworkChannel
getOption, supportedOptions
-
Constructor Details
-
DatagramChannel
初始化此类的新实例。- 参数:
-
provider
- 创建此通道的提供程序
-
-
Method Details
-
open
打开数据报通道。通过调用系统范围默认的
openDatagramChannel
方法创建新通道。该通道不会连接。通道的套接字的
ProtocolFamily
是平台(可能还取决于配置)相关的,因此未指定。当打开用于Internet协议多播的数据报通道时,应使用open
来选择协议族,并且应该用于打开用于Internet协议多播的数据报通道。- 返回:
- 一个新的数据报通道
- 抛出:
-
IOException
- 如果发生I/O错误 - 参见:
-
open
打开数据报通道。family
参数用于指定ProtocolFamily
。如果数据报通道用于IP多播,则应与此通道将加入的多播组的地址类型对应。通过调用系统范围默认的
openDatagramChannel
方法创建新通道。该通道不会连接。- API注释:
- 不支持Unix域套接字。
- 参数:
-
family
- 协议族 - 返回:
- 一个新的数据报通道
- 抛出:
-
UnsupportedOperationException
- 如果不支持指定的协议族。例如,假设参数指定为StandardProtocolFamily.INET6
,但平台上未启用IPv6。 -
IOException
- 如果发生I/O错误 - 自:
- 1.7
- 参见:
-
validOps
public final int validOps()返回标识此通道支持的操作的操作集。数据报通道支持读取和写入,因此此方法返回
(
SelectionKey.OP_READ
|
SelectionKey.OP_WRITE
)
。- 在类中指定:
-
validOps
in classSelectableChannel
- 返回:
- 有效操作集
-
bind
从接口中复制的描述:NetworkChannel
将通道的套接字绑定到本地地址。此方法用于在套接字和本地地址之间建立关联。一旦建立关联,套接字将保持绑定直到通道关闭。如果
local
参数的值为null
,则套接字将绑定到自动分配的地址。- 指定者:
-
bind
在接口NetworkChannel
中 - 参数:
-
local
- 要绑定套接字的地址,或者null
以将套接字绑定到自动分配的套接字地址 - 返回值:
- 此通道
- 抛出:
-
AlreadyBoundException
- 如果套接字已经绑定 -
UnsupportedAddressTypeException
- 如果给定地址的类型不受支持 -
ClosedChannelException
- 如果通道已关闭 -
IOException
- 如果发生其他I/O错误 -
SecurityException
- 如果已安装安全管理器并且其checkListen
方法拒绝操作 - 自从:
- 1.7
- 参见:
-
setOption
从接口复制的描述:NetworkChannel
设置套接字选项的值。- 指定者:
-
setOption
在接口NetworkChannel
中 - 类型参数:
-
T
- 套接字选项值的类型 - 参数:
-
name
- 套接字选项 -
value
- 套接字选项的值。对于某些套接字选项,null
可能是有效值。 - 返回值:
- 此通道
- 抛出:
-
UnsupportedOperationException
- 如果此通道不支持套接字选项 -
IllegalArgumentException
- 如果值不是此套接字选项的有效值 -
ClosedChannelException
- 如果此通道已关闭 -
IOException
- 如果发生I/O错误 - 自从:
- 1.7
- 参见:
-
socket
检索与此通道关联的数据报套接字。- 返回值:
- 与此通道关联的数据报套接字
-
isConnected
public abstract boolean isConnected()告知此通道的套接字是否已连接。- 返回值:
-
如果且仅当此通道的套接字
open
且已连接时为true
-
connect
连接此通道的套接字。配置通道的套接字,以便仅从给定的远程对等地址接收数据报,并向该地址发送数据报。一旦连接,就不能从任何其他地址接收或发送数据报。在调用此方法之前未接收的通道的套接字接收缓冲区中的数据报可能会被丢弃。通道的套接字保持连接状态,直到显式断开连接或关闭为止。
此方法执行与
connect
方法相同的安全检查,即如果已安装安全管理器,则此方法验证其checkAccept
和checkConnect
方法是否允许从给定的远程地址接收和发送数据报。一旦连接,将不再为从给定的远程地址接收或发送的数据报执行进一步的安全检查。应注意确保连接的数据报通道不与不受信任的代码共享。此方法可以随时调用。如果另一个线程已经启动了对此通道的读取或写入操作,则调用此方法将阻塞,直到任何此类操作完成。如果此通道的套接字未绑定,则此方法将首先导致套接字绑定到自动分配的地址,就好像使用
null
参数调用bind
方法一样。- 参数:
-
remote
- 要连接此通道的远程地址 - 返回值:
- 此数据报通道
- 抛出:
-
AlreadyConnectedException
- 如果此通道已连接 -
ClosedChannelException
- 如果此通道已关闭 -
AsynchronousCloseException
- 如果另一个线程在连接操作进行中关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在连接操作进行中中断当前线程,从而关闭通道并设置当前线程的中断状态 -
UnresolvedAddressException
- 如果给定的远程地址未完全解析 -
UnsupportedAddressTypeException
- 如果给定的远程地址的类型不受支持 -
SecurityException
- 如果已安装安全管理器并且不允许访问给定的远程地址,或者如果未绑定,则安全管理器的checkListen
方法拒绝操作 -
IOException
- 如果发生其他I/O错误
-
disconnect
断开此通道的套接字。配置通道的套接字,以便只要安全管理器(如果已安装)允许,就可以从任何远程地址接收数据报并向其发送数据报。
此方法可以随时调用。如果另一个线程已经启动了对此通道的读取或写入操作,则调用此方法将阻塞,直到任何此类操作完成。
如果此通道的套接字未连接,或者通道已关闭,则调用此方法不会产生任何效果。
- API注释:
- 如果此方法抛出IOException,则通道的套接字可能处于未指定状态。强烈建议在断开连接失败时关闭通道。
- 返回值:
- 此数据报通道
- 抛出:
-
IOException
- 如果发生其他I/O错误
-
getRemoteAddress
返回此通道的套接字连接的远程地址。- 返回值:
-
远程地址;如果通道的套接字未连接,则为
null
- 抛出:
-
ClosedChannelException
- 如果通道已关闭 -
IOException
- 如果发生I/O错误 - 自从:
- 1.7
-
receive
通过此通道接收数据报。如果立即可用数据报,或者如果此通道处于阻塞模式并且最终会有数据报可用,则将数据报复制到给定的字节缓冲区中,并返回其源地址。如果此通道处于非阻塞模式且数据报不立即可用,则此方法立即返回
null
。数据报从其当前位置开始传输到给定的字节缓冲区,就像通过常规的
read
操作一样。如果缓冲区中剩余的字节数少于所需的数据报,则其余部分将被静默丢弃。此方法执行与
receive
方法相同的安全检查,即如果套接字未连接到特定远程地址并且已安装安全管理器,则对于每个接收到的数据报,此方法验证源地址和端口号是否被安全管理器的checkAccept
方法允许。未经安全管理器允许的数据报将被静默丢弃。可以通过首先通过connect
方法连接套接字来避免此安全检查的开销。此方法可以随时调用。但是,如果另一个线程已经启动了对此通道的读取操作,则调用此方法将阻塞,直到第一个操作完成。如果此通道的套接字未绑定,则此方法将首先导致套接字绑定到自动分配的地址,就好像使用
null
参数调用bind
方法一样。- 参数:
-
dst
- 要传输数据报的缓冲区 - 返回:
-
数据报的源地址,如果通道处于非阻塞模式且没有立即可用的数据报,则返回
null
- 抛出:
-
IllegalArgumentException
- 如果缓冲区是只读的 -
ClosedChannelException
- 如果通道已关闭 -
AsynchronousCloseException
- 如果另一个线程在读取操作进行中关闭了此通道 -
ClosedByInterruptException
- 如果另一个线程在读取操作进行中中断了当前线程,从而关闭了通道并设置了当前线程的中断状态 -
SecurityException
- 如果未绑定,并且已安装安全管理器且其checkListen
方法拒绝操作 -
IOException
- 如果发生其他I/O错误
-
send
通过此通道发送数据报。如果通道处于非阻塞模式且底层输出缓冲区有足够的空间,或者如果通道处于阻塞模式且有足够的空间可用,则给定缓冲区中剩余的字节将作为单个数据报传输到给定的目标地址。
数据报从字节缓冲区传输,就像通过常规的
write
操作一样。此方法执行与
DatagramSocket
类的send
方法完全相同的安全检查。也就是说,如果套接字未连接到特定远程地址并且已安装安全管理器,则对于每个发送的数据报,此方法会验证安全管理器的checkConnect
方法是否允许目标地址和端口号。通过首先通过connect
方法连接套接字可以避免此安全检查的开销。此方法可以随时调用。但是,如果另一个线程已经启动了对此通道的写操作,则此方法的调用将阻塞,直到第一个操作完成。如果此通道的套接字未绑定,则此方法将首先导致套接字绑定到自动分配的地址,就像通过使用参数
null
调用bind
方法一样。- 参数:
-
src
- 要发送的数据报的缓冲区 -
target
- 要发送数据报的地址 - 返回:
- 发送的字节数,可能是调用此方法时源缓冲区中剩余的字节数,或者如果此通道是非阻塞的,则在底层输出缓冲区中没有足够空间来容纳数据报时可能为零
- 抛出:
-
AlreadyConnectedException
- 如果此通道连接到与target
指定的不同地址 -
ClosedChannelException
- 如果通道已关闭 -
AsynchronousCloseException
- 如果另一个线程在读取操作进行中关闭了此通道 -
ClosedByInterruptException
- 如果另一个线程在读取操作进行中中断了当前线程,从而关闭了通道并设置了当前线程的中断状态 -
UnresolvedAddressException
- 如果给定的远程地址未完全解析 -
UnsupportedAddressTypeException
- 如果给定的远程地址类型不受支持 -
SecurityException
- 如果已安装安全管理器且不允许将数据报发送到给定地址,或者未绑定,并且安全管理器的checkListen
方法拒绝操作 -
IOException
- 如果发生其他I/O错误
-
read
从此通道读取数据报。只有在此通道的套接字已连接且仅接受来自套接字对等方的数据报时才能调用此方法。如果数据报中的字节数多于给定缓冲区中剩余的字节数,则数据报的其余部分将被静默丢弃。否则,此方法的行为与
ReadableByteChannel
接口中指定的完全相同。- 指定者:
-
read
在接口ReadableByteChannel
- 参数:
-
dst
- 要传输字节的缓冲区 - 返回:
-
读取的字节数,可能为零,或者如果通道已到达流的末尾,则为
-1
- 抛出:
-
NotYetConnectedException
- 如果此通道的套接字未连接 -
ClosedChannelException
- 如果通道已关闭 -
AsynchronousCloseException
- 如果另一个线程在读取操作进行中关闭了此通道 -
ClosedByInterruptException
- 如果另一个线程在读取操作进行中中断了当前线程,从而关闭了通道并设置了当前线程的中断状态 -
IOException
- 如果发生其他I/O错误
-
read
从此通道读取数据报。只有在此通道的套接字已连接且仅接受来自套接字对等方的数据报时才能调用此方法。如果数据报中的字节数多于给定缓冲区中剩余的字节数,则数据报的其余部分将被静默丢弃。否则,此方法的行为与
ScatteringByteChannel
接口中指定的完全相同。- 指定者:
-
read
在接口ScatteringByteChannel
- 参数:
-
dsts
- 要传输字节的缓冲区 -
offset
- 第一个要传输字节的缓冲区在缓冲区数组中的偏移量;必须是非负数且不大于dsts.length
-
length
- 要访问的最大缓冲区数;必须是非负数且不大于dsts.length
-offset
- 返回:
-
读取的字节数,可能为零,或者如果通道已到达流的末尾,则为
-1
- 抛出:
-
NotYetConnectedException
- 如果此通道的套接字未连接 -
ClosedChannelException
- 如果通道已关闭 -
AsynchronousCloseException
- 如果另一个线程在读取操作进行中关闭了此通道 -
ClosedByInterruptException
- 如果另一个线程在读取操作进行中中断了当前线程,从而关闭了通道并设置了当前线程的中断状态 -
IOException
- 如果发生其他I/O错误
-
read
从此通道读取数据报。只有在此通道的套接字已连接且仅接受来自套接字对等方的数据报时才能调用此方法。如果数据报中的字节数多于给定缓冲区中剩余的字节数,则数据报的其余部分将被静默丢弃。否则,此方法的行为与
ScatteringByteChannel
接口中指定的完全相同。- 指定由:
-
read
在接口ScatteringByteChannel
- 参数:
-
dsts
- 要传输字节的缓冲区 - 返回:
-
读取的字节数,可能为零,或者如果通道已到达流的末尾,则为
-1
- 抛出:
-
NotYetConnectedException
- 如果此通道的套接字未连接 -
ClosedChannelException
- 如果此通道已关闭 -
AsynchronousCloseException
- 如果另一个线程在读取操作进行中关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在读取操作进行中中断当前线程,从而关闭通道并设置当前线程的中断状态 -
IOException
- 如果发生其他I/O错误
-
write
向此通道写入数据报。只有在此通道的套接字已连接时才能调用此方法,在这种情况下,它会直接将数据报发送到套接字的对等方。否则,它的行为与
WritableByteChannel
接口中指定的完全相同。- 指定由:
-
write
在接口WritableByteChannel
- 参数:
-
src
- 要检索字节的缓冲区 - 返回:
- 写入的字节数,可能为零
- 抛出:
-
NotYetConnectedException
- 如果此通道的套接字未连接 -
ClosedChannelException
- 如果此通道已关闭 -
AsynchronousCloseException
- 如果另一个线程在写入操作进行中关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在写入操作进行中中断当前线程,从而关闭通道并设置当前线程的中断状态 -
IOException
- 如果发生其他I/O错误
-
write
向此通道写入数据报。只有在此通道的套接字已连接时才能调用此方法,在这种情况下,它会直接将数据报发送到套接字的对等方。否则,它的行为与
GatheringByteChannel
接口中指定的完全相同。- 指定由:
-
write
在接口GatheringByteChannel
- 参数:
-
srcs
- 要检索字节的缓冲区 -
offset
- 要从中检索字节的第一个缓冲区在缓冲区数组中的偏移量;必须是非负的且不大于srcs.length
-
length
- 要访问的最大缓冲区数;必须是非负的且不大于srcs.length
-offset
- 返回:
- 发送的字节数,将是在调用此方法时源缓冲区中剩余的字节数,或者如果此通道是非阻塞的,则在底层输出缓冲区中没有足够空间放置数据报时可能为零
- 抛出:
-
NotYetConnectedException
- 如果此通道的套接字未连接 -
ClosedChannelException
- 如果此通道已关闭 -
AsynchronousCloseException
- 如果另一个线程在写入操作进行中关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在写入操作进行中中断当前线程,从而关闭通道并设置当前线程的中断状态 -
IOException
- 如果发生其他I/O错误
-
write
向此通道写入数据报。只有在此通道的套接字已连接时才能调用此方法,在这种情况下,它会直接将数据报发送到套接字的对等方。否则,它的行为与
GatheringByteChannel
接口中指定的完全相同。- 指定由:
-
write
在接口GatheringByteChannel
- 参数:
-
srcs
- 要检索字节的缓冲区 - 返回:
- 发送的字节数,将是在调用此方法时源缓冲区中剩余的字节数,或者如果此通道是非阻塞的,则在底层输出缓冲区中没有足够空间放置数据报时可能为零
- 抛出:
-
NotYetConnectedException
- 如果此通道的套接字未连接 -
ClosedChannelException
- 如果此通道已关闭 -
AsynchronousCloseException
- 如果另一个线程在写入操作进行中关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在写入操作进行中中断当前线程,从而关闭通道并设置当前线程的中断状态 -
IOException
- 如果发生其他I/O错误
-
getLocalAddress
返回此通道的套接字绑定到的套接字地址。如果通道
绑定
到互联网协议套接字地址,则此方法的返回值是InetSocketAddress
类型。如果设置了安全管理器,则将使用其
checkConnect
方法,以本地地址和-1
作为参数来查看操作是否被允许。如果不允许该操作,则返回代表环回
地址和通道套接字的本地端口的SocketAddress
。- 指定由:
-
getLocalAddress
在接口NetworkChannel
- 返回:
-
套接字绑定到的
SocketAddress
,如果安全管理器拒绝,则为代表环回地址的SocketAddress
,如果通道的套接字未绑定则为null
- 抛出:
-
ClosedChannelException
- 如果通道已关闭 -
IOException
- 如果发生I/O错误
-