public abstract class DatagramChannel extends AbstractSelectableChannel implements ByteChannel, ScatteringByteChannel, GatheringByteChannel, MulticastChannel
通过调用此类的open方法之一创建数据报通道。 不可能为任意的,预先存在的数据报套接字创建一个通道。 新创建的数据报通道已打开但未连接。 无需连接数据报通道,以便使用send和receive方法。 可以通过调用其connect方法来连接数据报信道,以避免安全检查的开销作为每个发送和接收操作的一部分。 为了使用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
数据报通道可以安全使用多个并发线程。 他们支持并发阅读和写作,但最多只有一个线程可能正在读取,并且最多一个线程可能在任何给定的时间写入。
| 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, registerregisterbegin, close, end, isOpenclone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitclose, join, joingetOption, supportedOptionsprotected 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错误
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.