- java.lang.Object
-
- java.nio.channels.spi.AbstractInterruptibleChannel
-
- java.nio.channels.SelectableChannel
-
- java.nio.channels.spi.AbstractSelectableChannel
-
- java.nio.channels.DatagramChannel
-
- All Implemented Interfaces:
-
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
方法。 可以通过调用其connect
方法来连接数据报信道 ,以避免安全检查的开销作为每个发送和接收操作的一部分。 必须连接数据报通道才能使用read
和write
方法,因为这些方法不接受或返回套接字地址。一旦连接,数据报通道保持连接,直到断开或关闭。 数据报信道是否连接可以通过调用其
isConnected
方法来确定。套接字选项使用
setOption
方法进行配置。 Internet协议套接字的数据报通道支持以下选项:Option Name 描述 SO_SNDBUF
The size of the socket send buffer SO_RCVBUF
The size of the socket receive buffer SO_REUSEADDR
Re-use address SO_BROADCAST
Allow transmission of broadcast datagrams IP_TOS
The Type of Service (ToS) octet in the Internet Protocol (IP) header IP_MULTICAST_IF
The network interface for Internet Protocol (IP) multicast datagrams IP_MULTICAST_TTL
The time-to-live for Internet Protocol (IP) multicast datagrams IP_MULTICAST_LOOP
Loopback for Internet Protocol (IP) multicast datagrams 数据报通道可以安全使用多个并发线程。 他们支持并发阅读和写作,尽管最多只有一个线程可能正在读取,并且最多一个线程可能在任何给定的时间写入。
- 从以下版本开始:
- 1.4
-
-
构造方法摘要
构造方法 Modifier Constructor 描述 protected
DatagramChannel(SelectorProvider provider)
初始化此类的新实例。
-
方法摘要
所有方法 静态方法 接口方法 抽象方法 具体的方法 Modifier and Type 方法 描述 abstract DatagramChannel
bind(SocketAddress local)
将通道的套接字绑定到本地地址。abstract DatagramChannel
connect(SocketAddress remote)
连接此通道的插座。abstract DatagramChannel
disconnect()
断开此通道的插座。abstract SocketAddress
getLocalAddress()
返回此通道的套接字所绑定的套接字地址。abstract SocketAddress
getRemoteAddress()
返回此通道的插座所连接的远程地址。abstract boolean
isConnected()
告诉这个通道的插座是否连接。static DatagramChannel
open()
打开数据报通道。static DatagramChannel
open(ProtocolFamily family)
打开数据报通道。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 <T> DatagramChannel
setOption(SocketOption<T> name, T value)
设置套接字选项的值。abstract DatagramSocket
socket()
检索与此通道相关联的数据报套接字。int
validOps()
返回确定此频道支持的操作的操作集。abstract int
write(ByteBuffer src)
将数据报写入此通道。long
write(ByteBuffer[] srcs)
将数据报写入此通道。abstract long
write(ByteBuffer[] srcs, int offset, int length)
将数据报写入此通道。-
Methods inherited from class java.nio.channels.spi.AbstractInterruptibleChannel
begin, close, end, isOpen
-
Methods inherited from class java.nio.channels.spi.AbstractSelectableChannel
blockingLock, configureBlocking, implCloseChannel, implCloseSelectableChannel, implConfigureBlocking, isBlocking, isRegistered, keyFor, provider, register
-
Methods inherited from interface java.nio.channels.MulticastChannel
close, join, join
-
Methods inherited from interface java.nio.channels.NetworkChannel
getOption, supportedOptions
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from class java.nio.channels.SelectableChannel
register
-
-
-
-
构造方法详细信息
-
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
方法完全相同的安全检查。 也就是说,如果已经安装了安全管理器,则该方法验证其270560369231283和checkConnect
方法是否允许分别从给定的远程地址接收数据报并将其发送给给定的远程地址。可以随时调用此方法。 它在对被调用的时刻已经进行的读取或写入操作不会有任何影响。 如果此通道的套接字未绑定,则此方法将首先使套接字绑定到自动分配的地址,就像调用参数为
null
的bind
方法null
。- 参数
-
remote
- 要连接该通道的远程地址 - 结果
- 这个数据报通道
- 异常
-
ClosedChannelException
- 如果此通道关闭 -
AsynchronousCloseException
- 如果另一个线程在连接操作进行过程中关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在连接操作进行过程中中断当前线程,从而关闭通道并设置当前线程的中断状态 -
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
- 要传输数据报的缓冲区 - 结果
-
数据报的源地址,或
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
- 要发送数据报的地址 - 结果
- 发送的字节数,这是调用此方法时在源缓冲区中剩余的字节数,或者如果此通道不阻塞,则可能为零,如果底层中的数据报的空间不足输出缓冲区
- 异常
-
ClosedChannelException
- 如果此通道关闭 -
AsynchronousCloseException
- 如果另一个线程在读取操作正在进行时关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在读取操作正在进行中断当前线程,从而关闭通道并设置当前线程的中断状态 -
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
返回此通道的套接字所绑定的套接字地址。通道为Internet协议套接字地址的通道为
bound
,则此方法的返回值为InetSocketAddress
。如果有一个安全管理器集,其
checkConnect
方法将以本地地址和-1
作为参数来调用,以查看是否允许该操作。 如果不允许操作,则SocketAddress
表示loopback
地址的SocketAddress和通道插座的本地端口。- Specified by:
-
getLocalAddress
在接口NetworkChannel
- 结果
-
SocketAddress
表示该套接字绑定,或SocketAddress
表示环回地址,如果安全管理员拒绝,或null
如果该通道的套接字未绑定 - 异常
-
ClosedChannelException
- 如果通道关闭 -
IOException
- 如果发生I / O错误
-
-