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
数据报通道可以安全使用多个并发线程。 他们支持并发阅读和写作,但最多只有一个线程可能正在读取,并且最多一个线程可能在任何给定的时间写入。
Modifier | Constructor and Description |
---|---|
protected |
DatagramChannel(SelectorProvider provider)
初始化此类的新实例。
|
Modifier and Type | Method and Description |
---|---|
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)
将数据报写入此通道。
|
blockingLock, configureBlocking, implCloseChannel, implCloseSelectableChannel, implConfigureBlocking, isBlocking, isRegistered, keyFor, provider, register
register
begin, close, end, isOpen
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
close, join, join
getOption, supportedOptions
protected DatagramChannel(SelectorProvider provider)
provider
- 创建此频道的提供商
public static DatagramChannel open() throws IOException
新通道是通过调用系统范围的默认SelectorProvider
对象的openDatagramChannel
方法创建的。 通道不会连接。
通道插座的ProtocolFamily
是平台(可能是配置),因此是未指定的。 open
允许在打开数据报通道时选择协议族,并且应该用于打开用于Internet协议组播的数据报通道。
IOException
- 如果发生I / O错误
public static DatagramChannel open(ProtocolFamily family) throws IOException
family
参数用于指定ProtocolFamily
。 如果要将数据报通道用于IP组播,则应该与该通道将加入的组播组的地址类型相对应。
通过调用系统范围默认的SelectorProvider
对象的openDatagramChannel
方法创建新通道。 通道不会连接。
family
- 协议族
UnsupportedOperationException
- 如果不支持指定的协议族。
例如,假设参数被指定为StandardProtocolFamily.INET6
,但是平台上未启用IPv6。
IOException
- 如果发生I / O错误
public final int validOps()
数据报通道支持读写,所以这种方法返回( SelectionKey.OP_READ
| SelectionKey.OP_WRITE
) 。
validOps
在
SelectableChannel
public abstract DatagramChannel bind(SocketAddress local) throws IOException
NetworkChannel
该方法用于在套接字和本地地址之间建立关联。 一旦建立关联,则套接字保持绑定,直到通道关闭。 如果local
参数的值为null
则套接字将被绑定到自动分配的地址。
bind
在界面
NetworkChannel
local
- 绑定套接字的地址,或
null
将套接字绑定到自动分配的套接字地址
AlreadyBoundException
- 如果套接字已经绑定
UnsupportedAddressTypeException
- 如果不支持给定地址的类型
ClosedChannelException
- 如果通道关闭
IOException
- 如果发生其他I / O错误
SecurityException
- 如果已安装安全管理员,并且其
checkListen
方法拒绝操作
NetworkChannel.getLocalAddress()
public abstract <T> DatagramChannel setOption(SocketOption<T> name, T value) throws IOException
NetworkChannel
复制
setOption
在界面
NetworkChannel
T
- 套接字选项值的类型
name
- 套接字选项
value
- 套接字选项的值。
值为null
可能是某些套接字选项的有效值。
UnsupportedOperationException
- 如果此通道不支持套接字选项
IllegalArgumentException
- 如果该值不是此套接字选项的有效值
ClosedChannelException
- 如果此频道关闭
IOException
- 如果发生I / O错误
StandardSocketOptions
public abstract DatagramSocket socket()
返回的对象不会声明没有在DatagramSocket
类中声明的任何公共方法。
public abstract boolean isConnected()
true
如果,并且只有这个通道的插座是
open
并连接
public abstract DatagramChannel connect(SocketAddress remote) throws IOException
通道的套接字被配置为仅从给定的远程对等地址接收数据报,并发送数据报。 一旦连接,数据报可能不会被接收或发送到任何其他地址。 数据报套接字保持连接,直到它被明确地断开或直到它被关闭。
该方法执行与DatagramSocket
类的connect
方法完全相同的安全检查。 也就是说,如果已经安装了安全管理器,则该方法验证其checkAccept
和checkConnect
方法是否允许分别从给定的远程地址接收数据报并发送给它们。
可以随时调用此方法。 它在对被调用的时刻已经进行的读取或写入操作不会有任何影响。 如果此通道的套接字未绑定,则此方法将首先使套接字绑定到自动分配的地址,就像调用参数为null的bind
方法null
。
remote
- 要连接此通道的远程地址
ClosedChannelException
- 如果此通道关闭
AsynchronousCloseException
- 如果另一个线程在连接操作进行过程中关闭此通道
ClosedByInterruptException
- 如果另一个线程在连接操作进行过程中中断当前线程,从而关闭通道并设置当前线程的中断状态
SecurityException
- 如果已安装安全管理器,并且不允许访问给定的远程地址
IOException
- 如果发生其他I / O错误
public abstract DatagramChannel disconnect() throws IOException
通道的套接字被配置为使得它可以从任何远程地址接收数据报,并发送数据报,只要安全管理器(如果已安装)就允许它。
可以随时调用此方法。 它在对被调用的时刻已经进行的读取或写入操作不会有任何影响。
如果此通道的插座未连接,或者通道关闭,则调用此方法不起作用。
IOException
- 如果发生其他I / O错误
public abstract SocketAddress getRemoteAddress() throws IOException
null
如果通道的插座未连接
ClosedChannelException
- 如果通道关闭
IOException
- 如果发生I / O错误
public abstract SocketAddress receive(ByteBuffer dst) throws IOException
如果数据报可以立即可用,或者如果此通道处于阻塞模式,并且最终变为可用,则将数据报复制到给定的字节缓冲区中,并返回其源地址。 如果此通道处于非阻塞模式,并且数据报不能立即可用,则此方法立即返回null 。
数据报从其当前位置开始传输到给定的字节缓冲区,就像通常的read
操作一样。 如果缓冲区中剩余的字节比保存数据报所需的字节少,则数据报的其余部分将被静默地丢弃。
该方法执行与DatagramSocket
类别的receive
方法完全相同的安全检查。 也就是说,如果套接字没有连接到特定的远程地址,并且已经安装了安全管理器,那么对于接收到的每个数据报,该方法验证安全管理器的checkAccept
方法允许源的地址和端口号。 首先通过connect
方法连接插座可以避免此安全检查的开销。
可以随时调用此方法。 但是,如果另一个线程已经在该通道上启动了读取操作,那么此方法的调用将阻塞,直到第一个操作完成。 如果此通道的套接字未绑定,则此方法将首先使套接字绑定到自动分配的地址,就像调用参数为null的bind
方法null
。
dst
-
dst
数据报传输到的缓冲区
ClosedChannelException
- 如果此通道关闭
AsynchronousCloseException
- 如果另一个线程在读操作正在进行时关闭此通道
ClosedByInterruptException
- 如果另一个线程在读取操作正在进行中断当前线程,从而关闭通道并设置当前线程的中断状态
SecurityException
- 如果已安装安全管理器,并且不允许从数据报发件人接受数据报
IOException
- 如果发生其他I / O错误
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错误
public abstract int read(ByteBuffer dst) throws IOException
此方法只能在该通道的套接字连接时被调用,并且只接受套接字对等体的数据报。 如果数据报中存在比保留在给定缓冲区中更多的字节,则数据报的其余部分将被静默地丢弃。 否则,此方法的行为与ReadableByteChannel
接口中的规定完全相同。
read
在接口
ReadableByteChannel
dst
- 要传输字节的缓冲区
NotYetConnectedException
- 如果此通道的插座未连接
ClosedChannelException
- 如果此通道关闭
AsynchronousCloseException
- 如果另一个线程在读取操作正在进行时关闭此通道
ClosedByInterruptException
- 如果另一个线程在读取操作正在进行中断当前线程,从而关闭通道并设置当前线程的中断状态
IOException
- 如果发生其他I / O错误
public abstract long read(ByteBuffer[] dsts, int offset, int length) throws IOException
此方法只能在该通道的套接字连接时被调用,并且只接受套接字对等体的数据报。 如果数据报中存在比保留在给定缓冲区中更多的字节,则数据报的其余部分将被静默地丢弃。 否则,此方法的行为与ScatteringByteChannel
界面中的规定完全相同。
read
中的
ScatteringByteChannel
dsts
- 要传输字节的缓冲区
offset
- 要传输字节的第一个缓冲区的缓冲区中的偏移量;
必须是非负数,不得大于dsts.length
length
- 要访问的缓冲区的最大数量;
必须是非负数,不得大于dsts.length - offset
NotYetConnectedException
- 如果此通道的插座未连接
ClosedChannelException
- 如果此通道关闭
AsynchronousCloseException
- 如果另一个线程在读取操作正在进行时关闭此通道
ClosedByInterruptException
- 如果另一个线程在读取操作正在进行中断当前线程,从而关闭通道并设置当前线程的中断状态
IOException
- 如果发生其他I / O错误
public final long read(ByteBuffer[] dsts) throws IOException
此方法只能在该通道的套接字连接时被调用,并且只接受套接字对等体的数据报。 如果数据报中存在比保留在给定缓冲区中更多的字节,则数据报的其余部分将被静默地丢弃。 否则,此方法的行为与ScatteringByteChannel
界面中的规定完全相同。
read
中的
ScatteringByteChannel
dsts
- 要传输字节的缓冲区
NotYetConnectedException
- 如果此通道的插座未连接
ClosedChannelException
- 如果此通道关闭
AsynchronousCloseException
- 如果另一个线程在读取操作正在进行时关闭此通道
ClosedByInterruptException
- 如果另一个线程在读取操作正在进行中断当前线程,从而关闭通道并设置当前线程的中断状态
IOException
- 如果发生其他I / O错误
public abstract int write(ByteBuffer src) throws IOException
此方法只能在该通道的套接字连接时被调用,在这种情况下,它将数据报直接发送到套接字的对等体。 否则它的行为与WritableByteChannel
界面中的规定完全相同。
write
中的
WritableByteChannel
src
- 要检索字节的缓冲区
NotYetConnectedException
- 如果此通道的插座未连接
ClosedChannelException
- 如果此通道关闭
AsynchronousCloseException
- 如果另一个线程在写操作正在进行时关闭此通道
ClosedByInterruptException
- 如果另一个线程在写操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态
IOException
- 如果发生其他I / O错误
public abstract long write(ByteBuffer[] srcs, int offset, int length) throws IOException
此方法只能在该通道的套接字连接时被调用,在这种情况下,它将数据报直接发送到套接字的对等体。 否则它的行为与GatheringByteChannel
接口中的规定完全相同。
write
在接口
GatheringByteChannel
srcs
- 要检索字节的缓冲区
offset
- 要从中检索字节的第一个缓冲区的缓冲区数组中的偏移量;
必须是非负数,不得大于srcs.length
length
- 要访问的缓冲区的最大数量;
必须是非负数,不得大于srcs.length - offset
NotYetConnectedException
- 如果此通道的插座未连接
ClosedChannelException
- 如果此通道关闭
AsynchronousCloseException
- 如果另一个线程在写操作正在进行时关闭此通道
ClosedByInterruptException
- 如果另一个线程在写操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态
IOException
- 如果发生其他I / O错误
public final long write(ByteBuffer[] srcs) throws IOException
此方法只能在该通道的套接字连接时被调用,在这种情况下,它将数据报直接发送到套接字的对等体。 否则它的行为与GatheringByteChannel
界面中的规定完全相同。
write
在接口
GatheringByteChannel
srcs
- 要检索字节的缓冲区
NotYetConnectedException
- 如果此通道的插座未连接
ClosedChannelException
- 如果此通道关闭
AsynchronousCloseException
- 如果另一个线程在写操作正在进行时关闭此通道
ClosedByInterruptException
- 如果另一个线程在写操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态
IOException
- 如果发生其他I / O错误
public abstract SocketAddress getLocalAddress() throws IOException
通道为Internet协议套接字地址的bound
,则该方法的返回值为InetSocketAddress
。
如果有一个安全管理器集,其checkConnect
方法checkConnect
本地地址和-1
作为参数来调用,以查看是否允许该操作。 如果不允许的操作, SocketAddress
代表loopback
个地址和通道的套接字的本地端口返回。
getLocalAddress
在接口
NetworkChannel
SocketAddress
,该套接字绑定到,或
SocketAddress
代表的环回地址,如果安全管理器拒绝,或
null
如果通道的套接字不绑定
ClosedChannelException
- 如果通道关闭
IOException
- 如果发生I / O错误