- java.lang.Object
-
- java.nio.channels.spi.AbstractInterruptibleChannel
-
- java.nio.channels.SelectableChannel
-
- java.nio.channels.spi.AbstractSelectableChannel
-
- java.nio.channels.DatagramChannel
-
- 实现的所有接口
-
Closeable,AutoCloseable,ByteChannel,Channel,GatheringByteChannel,InterruptibleChannel,MulticastChannel,NetworkChannel,ReadableByteChannel,ScatteringByteChannel,WritableByteChannel
public abstract class DatagramChannel extends AbstractSelectableChannel implements ByteChannel, ScatteringByteChannel, GatheringByteChannel, MulticastChannel
面向数据报的套接字的可选通道。通过调用此类的
open方法之一来创建数据报通道。 无法为任意预先存在的数据报套接字创建通道。 新创建的数据报通道已打开但未连接。 不需要连接数据报通道,以便使用send和receive方法。 可以通过调用其方法来连接数据报信道 ,以避免安全检查的开销作为每个发送和接收操作的一部分来执行。 必须连接数据报通道才能使用read和write方法,因为这些方法不接受或返回套接字地址。连接后,数据报通道保持连接状态,直到断开或关闭为止。 无论是否连接的数据报通道可通过调用其来确定
isConnected方法。使用
setOption方法配置套接字选项。 Internet协议套接字的数据报通道支持以下选项:
还可以支持其他(特定于实现的)选项。Option Name 描述 SO_SNDBUFThe size of the socket send buffer SO_RCVBUFThe size of the socket receive buffer SO_REUSEADDRRe-use address SO_BROADCASTAllow transmission of broadcast datagrams IP_TOSThe Type of Service (ToS) octet in the Internet Protocol (IP) header IP_MULTICAST_IFThe network interface for Internet Protocol (IP) multicast datagrams IP_MULTICAST_TTLThe time-to-live for Internet Protocol (IP) multicast datagrams IP_MULTICAST_LOOPLoopback for Internet Protocol (IP) multicast datagrams 数据报通道可安全地供多个并发线程使用。 它们支持并发读写,但最多只有一个线程可能正在读取,并且最多一个线程可能在任何给定时间写入。
- 从以下版本开始:
- 1.4
-
-
构造方法摘要
构造方法 变量 构造器 描述 protectedDatagramChannel(SelectorProvider provider)初始化此类的新实例。
-
方法摘要
所有方法 静态方法 实例方法 抽象方法 具体的方法 变量和类型 方法 描述 abstract DatagramChannelbind(SocketAddress local)将通道的套接字绑定到本地地址。abstract DatagramChannelconnect(SocketAddress remote)连接此通道的插座。abstract DatagramChanneldisconnect()断开此通道的插槽。abstract SocketAddressgetLocalAddress()返回此通道的套接字绑定的套接字地址。abstract SocketAddressgetRemoteAddress()返回此通道的套接字连接的远程地址。abstract booleanisConnected()判断此通道的插座是否已连接。static DatagramChannelopen()打开数据报通道。static DatagramChannelopen(ProtocolFamily family)打开数据报通道。abstract intread(ByteBuffer dst)从该通道读取数据报。longread(ByteBuffer[] dsts)从该通道读取数据报。abstract longread(ByteBuffer[] dsts, int offset, int length)从该通道读取数据报。abstract SocketAddressreceive(ByteBuffer dst)通过此通道接收数据报。abstract intsend(ByteBuffer src, SocketAddress target)通过此通道发送数据报。abstract <T> DatagramChannelsetOption(SocketOption<T> name, T value)设置套接字选项的值。abstract DatagramSocketsocket()检索与此通道关联的数据报套接字。intvalidOps()返回标识此通道支持的操作的操作集。abstract intwrite(ByteBuffer src)将数据报写入此通道。longwrite(ByteBuffer[] srcs)将数据报写入此通道。abstract longwrite(ByteBuffer[] srcs, int offset, int length)将数据报写入此通道。-
声明方法的类 java.nio.channels.spi.AbstractSelectableChannel
configureBlocking, implCloseChannel, implCloseSelectableChannel, implConfigureBlocking, provider, register
-
声明方法的类 java.nio.channels.SelectableChannel
blockingLock, isBlocking, isRegistered, keyFor, register
-
声明方法的类 java.nio.channels.spi.AbstractInterruptibleChannel
begin, close, end
-
声明方法的类 java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
声明方法的接口 java.nio.channels.MulticastChannel
close, join, join
-
声明方法的接口 java.nio.channels.NetworkChannel
getOption, supportedOptions
-
-
-
-
构造方法详细信息
-
DatagramChannel
protected DatagramChannel(SelectorProvider provider)
初始化此类的新实例。- 参数
-
provider- 创建此频道的提供商
-
-
方法详细信息
-
open
public static DatagramChannel open() throws IOException
打开数据报通道。通过调用系统范围的默认
SelectorProvider对象的openDatagramChannel方法创建新通道。 频道将无法连接。通道套接字的
ProtocolFamily依赖于平台(可能是配置),因此未指定。open允许在打开数据报通道时选择协议族,并且应该用于打开用于Internet协议多播的数据报通道。- 结果
- 一个新的数据报通道
- 异常
-
IOException- 如果发生I / O错误
-
open
public static DatagramChannel open(ProtocolFamily family) throws IOException
打开数据报通道。family参数用于指定ProtocolFamily。 如果数据报通道用于IP多播,那么这应该对应于该通道将加入的多播组的地址类型。通过调用系统范围的默认
SelectorProvider对象的openDatagramChannel方法来创建新通道。 频道将无法连接。- 参数
-
family- 协议族 - 结果
- 一个新的数据报通道
- 异常
-
UnsupportedOperationException- 如果不支持指定的协议系列。 例如,假设参数指定为StandardProtocolFamily.INET6,但平台上未启用IPv6。 -
IOException- 如果发生I / O错误 - 从以下版本开始:
- 1.7
-
validOps
public final int validOps()
返回标识此通道支持的操作的操作集。数据报通道支持读写,因此该方法返回
(SelectionKey.OP_READ|SelectionKey.OP_WRITE)。- Specified by:
-
validOps在类SelectableChannel - 结果
- 有效操作集
-
bind
public abstract DatagramChannel bind(SocketAddress local) throws IOException
从界面复制的说明:NetworkChannel将通道的套接字绑定到本地地址。此方法用于在套接字和本地地址之间建立关联。 一旦建立关联,则套接字保持绑定直到通道关闭。 如果
local参数的值为null则套接字将绑定到自动分配的地址。- Specified by:
-
bind在接口NetworkChannel - 参数
-
local- 绑定套接字的地址,或null将套接字绑定到自动分配的套接字地址 - 结果
- 这个频道
- 异常
-
AlreadyBoundException- 如果套接字已绑定 -
UnsupportedAddressTypeException- 如果不支持给定地址的类型 -
ClosedChannelException- 如果频道已关闭 -
IOException- 如果发生其他一些I / O错误 -
SecurityException- 如果已安装安全管理器且其checkListen方法拒绝操作 - 从以下版本开始:
- 1.7
- 另请参见:
-
NetworkChannel.getLocalAddress()
-
setOption
public abstract <T> DatagramChannel setOption(SocketOption<T> name, T value) throws IOException
从界面复制的说明:NetworkChannel设置套接字选项的值。- Specified by:
-
setOption,界面NetworkChannel - 参数类型
-
T- 套接字选项值的类型 - 参数
-
name- 套接字选项 -
value- 套接字选项的值。 值null可能是某些套接字选项的有效值。 - 结果
- 这个频道
- 异常
-
UnsupportedOperationException- 如果此通道不支持套接字选项 -
IllegalArgumentException- 如果该值不是此套接字选项的有效值 -
ClosedChannelException- 如果此渠道已关闭 -
IOException- 如果发生I / O错误 - 从以下版本开始:
- 1.7
- 另请参见:
-
StandardSocketOptions
-
socket
public abstract DatagramSocket socket()
检索与此通道关联的数据报套接字。返回的对象不会声明未在
DatagramSocket类中声明的任何公共方法。- 结果
- 与此通道关联的数据报套接字
-
isConnected
public abstract boolean isConnected()
判断此通道的插座是否已连接。- 结果
-
true当且仅当此频道的套接字是open且已连接
-
connect
public abstract DatagramChannel connect(SocketAddress remote) throws IOException
连接此通道的插座。配置通道的套接字,使其仅从给定的远程对等地址接收数据报,并将数据报发送到给定的远程对等地址。 连接后,可能无法从任何其他地址接收或发送数据报。 数据报套接字保持连接,直到明确断开连接或关闭为止。
此方法执行与
DatagramSocket类的connect方法完全相同的安全检查。 也就是说,如果安装了安全管理器,则此方法将验证其checkAccept和checkConnect方法是否允许分别从给定的远程地址接收和发送数据报。可以随时调用此方法。 它对调用它时正在进行的读或写操作没有任何影响。 如果此通道的套接字未绑定,则此方法将首先使套接字绑定到自动分配的地址,就像调用参数为
null的bind方法null。- 参数
-
remote- 此通道要连接的远程地址 - 结果
- 这个数据报通道
- 异常
-
AlreadyConnectedException- 如果此通道已连接 -
ClosedChannelException- 如果此渠道已关闭 -
AsynchronousCloseException- 如果另一个线程在连接操作正在进行时关闭此通道 -
ClosedByInterruptException- 如果另一个线程在连接操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
UnresolvedAddressException- 如果给定的远程地址未完全解析 -
UnsupportedAddressTypeException- 如果不支持给定远程地址的类型 -
SecurityException- 如果已安装安全管理器且不允许访问给定的远程地址 -
IOException- 如果发生其他一些I / O错误
-
disconnect
public abstract DatagramChannel disconnect() throws IOException
断开此通道的插槽。通道的套接字已配置为只要安装管理器(如果已安装)允许,它就可以从任何远程地址接收数据报并将数据报发送到任何远程地址。
可以随时调用此方法。 它对调用它时正在进行的读或写操作没有任何影响。
如果未连接此通道的套接字,或者通道已关闭,则调用此方法无效。
- 结果
- 这个数据报通道
- 异常
-
IOException- 如果发生其他一些I / O错误
-
getRemoteAddress
public abstract SocketAddress getRemoteAddress() throws IOException
返回此通道的套接字连接的远程地址。- 结果
-
远程地址;
null如果未连接通道的套接字 - 异常
-
ClosedChannelException- 如果频道已关闭 -
IOException- 如果发生I / O错误 - 从以下版本开始:
- 1.7
-
receive
public abstract SocketAddress receive(ByteBuffer dst) throws IOException
通过此通道接收数据报。如果数据报立即可用,或者此通道处于阻塞模式且最终可用,则将数据报复制到给定的字节缓冲区中并返回其源地址。 如果此通道处于非阻塞模式且数据报未立即可用,则此方法立即返回
null。数据报从其当前位置开始传输到给定的字节缓冲区,就像通过常规的
read操作一样。 如果缓冲区中剩余的字节数少于保存数据报所需的字节数,则静默丢弃数据报的其余部分。此方法执行与
DatagramSocket类的receive方法完全相同的安全检查。 也就是说,如果套接字未连接到特定的远程地址并且已安装安全管理器,则对于接收到的每个数据报,此方法将验证安全管理器checkAccept方法是否允许源的地址和端口号。 首先通过connect方法连接套接字可以避免此安全检查的开销。可以随时调用此方法。 但是,如果另一个线程已经在此通道上启动了读操作,则此方法的调用将阻塞,直到第一个操作完成。 如果此通道的套接字未绑定,则此方法将首先使套接字绑定到自动分配的地址,就像调用参数为
null的bind方法null。- 参数
-
dst-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方法连接套接字可以避免此安全检查的开销。可以随时调用此方法。 但是,如果另一个线程已经在此通道上启动了写操作,则此方法的调用将阻塞,直到第一个操作完成。 如果此通道的套接字未绑定,则此方法将首先使套接字绑定到自动分配的地址,就像调用参数为
null的bind方法null。- 参数
-
src- 包含要发送的数据报的缓冲区 -
target- 要将数据报发送到的地址 - 结果
- 发送的字节数,可以是调用此方法时源缓冲区中剩余的字节数,或者,如果此通道是非阻塞的,如果底层数据报的空间不足,则可能为零输出缓冲区
- 异常
-
AlreadyConnectedException- 如果此通道连接到target指定的其他地址 -
ClosedChannelException- 如果此渠道已关闭 -
AsynchronousCloseException- 如果另一个线程在读操作正在进行时关闭此通道 -
ClosedByInterruptException- 如果另一个线程在读操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
UnresolvedAddressException- 如果给定的远程地址未完全解析 -
UnsupportedAddressTypeException- 如果不支持给定远程地址的类型 -
SecurityException- 如果已安装安全管理器且不允许将数据报发送到给定地址 -
IOException- 如果发生其他一些I / O错误
-
read
public abstract int read(ByteBuffer dst) throws IOException
从该通道读取数据报。如果此通道的套接字已连接,则只能调用此方法,并且它只接受来自套接字对等方的数据报。 如果数据报中的字节数多于保留在给定缓冲区中的字节数,则静默丢弃数据报的其余部分。 否则,此方法的行为与
ReadableByteChannel接口中指定的完全相同 。- Specified by:
-
read在界面ReadableByteChannel - 参数
-
dst- 要传输字节的缓冲区 - 结果
-
如果通道已到达流末尾,则读取的字节数(可能为零)或
-1 - 异常
-
NotYetConnectedException- 如果未连接此通道的插槽 -
ClosedChannelException- 如果此渠道已关闭 -
AsynchronousCloseException- 如果另一个线程在读操作正在进行时关闭此通道 -
ClosedByInterruptException- 如果另一个线程在读操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
IOException- 如果发生其他一些I / O错误
-
read
public abstract long read(ByteBuffer[] dsts, int offset, int length) throws IOException
从该通道读取数据报。如果此通道的套接字已连接,则只能调用此方法,并且它只接受来自套接字对等方的数据报。 如果数据报中的字节数多于保留在给定缓冲区中的字节数,则静默丢弃数据报的其余部分。 否则,此方法的行为与
ScatteringByteChannel接口中指定的完全相同 。- Specified by:
-
read在界面ScatteringByteChannel - 参数
-
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接口中指定的完全相同 。- Specified by:
-
read在界面ScatteringByteChannel - 参数
-
dsts- 要传输字节的缓冲区 - 结果
-
读取的字节数,可能为零,如果通道已到达流末尾,
-1 - 异常
-
NotYetConnectedException- 如果未连接此通道的插槽 -
ClosedChannelException- 如果此渠道已关闭 -
AsynchronousCloseException- 如果另一个线程在读取操作正在进行时关闭此通道 -
ClosedByInterruptException- 如果另一个线程在读操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
IOException- 如果发生其他一些I / O错误
-
write
public abstract int write(ByteBuffer src) throws IOException
将数据报写入此通道。如果连接了此通道的套接字,则只能调用此方法,在这种情况下,它会直接将数据报发送到套接字的对等方。 否则,其行为与
WritableByteChannel接口中指定的完全相同 。- Specified by:
-
write在界面WritableByteChannel - 参数
-
src- 要从中检索字节的缓冲区 - 结果
- 写入的字节数,可能为零
- 异常
-
NotYetConnectedException- 如果未连接此通道的套接字 -
ClosedChannelException- 如果此渠道已关闭 -
AsynchronousCloseException- 如果另一个线程在写操作正在进行时关闭此通道 -
ClosedByInterruptException- 如果另一个线程在写操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
IOException- 如果发生其他一些I / O错误
-
write
public abstract long write(ByteBuffer[] srcs, int offset, int length) throws IOException
将数据报写入此通道。如果连接了此通道的套接字,则只能调用此方法,在这种情况下,它会直接将数据报发送到套接字的对等方。 否则,其行为与
GatheringByteChannel接口中指定的完全相同 。- Specified by:
-
write在界面GatheringByteChannel - 参数
-
srcs- 要从中检索字节的缓冲区 -
offset- 要从中检索字节的第一个缓冲区的缓冲区数组中的偏移量; 必须是非负数且不大于srcs.length -
length- 要访问的最大缓冲区数; 必须是非负数且不大于srcs.length-offset - 结果
- 发送的字节数,可以是调用此方法时源缓冲区中剩余的字节数,或者,如果此通道是非阻塞的,如果底层数据报的空间不足,则可能为零输出缓冲区
- 异常
-
NotYetConnectedException- 如果未连接此通道的套接字 -
ClosedChannelException- 如果此渠道已关闭 -
AsynchronousCloseException- 如果另一个线程在写操作正在进行时关闭此通道 -
ClosedByInterruptException- 如果另一个线程在写操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
IOException- 如果发生其他一些I / O错误
-
write
public final long write(ByteBuffer[] srcs) throws IOException
将数据报写入此通道。如果连接了此通道的套接字,则只能调用此方法,在这种情况下,它会直接将数据报发送到套接字的对等方。 否则,它的行为与
GatheringByteChannel接口中指定的完全相同 。- Specified by:
-
write在界面GatheringByteChannel - 参数
-
srcs- 要从中检索字节的缓冲区 - 结果
- 发送的字节数,可以是调用此方法时源缓冲区中剩余的字节数,或者,如果此通道是非阻塞的,如果底层数据报的空间不足,则可能为零输出缓冲区
- 异常
-
NotYetConnectedException- 如果未连接此通道的套接字 -
ClosedChannelException- 如果此渠道已关闭 -
AsynchronousCloseException- 如果另一个线程在写操作正在进行时关闭此通道 -
ClosedByInterruptException- 如果另一个线程在写操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
IOException- 如果发生其他一些I / O错误
-
getLocalAddress
public abstract SocketAddress getLocalAddress() throws IOException
返回此通道的套接字绑定的套接字地址。如果通道是
bound到Internet协议套接字地址,则此方法的返回值是InetSocketAddress类型。如果存在安全管理器集,则使用本地地址和
-1作为其参数调用其checkConnect方法,以查看是否允许该操作。 如果不允许该操作,则SocketAddress表示loopback地址的SocketAddress和通道套接字的本地端口。- Specified by:
-
getLocalAddress在界面NetworkChannel - 结果
-
该
SocketAddress这套接字绑定到,或SocketAddress代表的环回地址,如果安全管理器拒绝,或null如果通道的套接字不绑定 - 异常
-
ClosedChannelException- 如果频道已关闭 -
IOException- 如果发生I / O错误
-
-