public abstract class DatagramChannel extends AbstractSelectableChannel implements ByteChannel, ScatteringByteChannel, GatheringByteChannel, MulticastChannel
数据通道是通过调用这个类的一个open
方法创建。这是不可能创造一个任意一个通道,预先存在的数据报套接字。新创建的数据通道是开放的但不连接。数据通道不需要连接要用send
和receive
方法。数据通道可连接,通过调用其connect
方法,为了避免安全检查的开销,否则进行各部分的发送和接收操作。数据通道必须连接才能使用read
和write
方法,因为这些方法不接受或返回套接字地址。
一旦连接,数据报通道保持连接直到断开或闭合。是否一个数据通道连接可以通过调用其isConnected
法测定。
套接字选项的配置使用setOption
方法。数据通道的互联网协议的套接字支持以下选项:
附加(具体实施)选项也可以支持。
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
新的通道是由调用openDatagramChannel
方法的默认SelectorProvider
对象。该通道将不会连接。
该频道的插座ProtocolFamily
平台(可能配置)依赖性,因此不。的open
允许协议的家庭可选择打开数据通道时,应使用开放的数据通道,用于互联网协议组播。
IOException
如果I/O错误发生
public static DatagramChannel open(ProtocolFamily family) throws IOException
的family
参数用于指定ProtocolFamily
。如果数据报通道是用于IP多播的话这应该对应于该频道将加入组播组的地址类型。
新的通道是由调用openDatagramChannel
方法的默认SelectorProvider
对象。该通道将不会连接。
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
绑定socket套接字地址的自动分配
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
方法允许数据包被接收和发送,分别给出的远程地址。
这种方法可能在任何时候被调用。它不会对已被调用的时刻已经在进行中的读写操作产生任何影响。如果这个通道的插座不一定那么这种方法首先会导致将套接字绑定到一个地址是自动分配的,如果调用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
方法避免。
这种方法可能在任何时候被调用。如果另一个线程已经在这个通道上启动了一个读操作,那么这个方法的调用将阻塞,直到第一个操作完成。如果这个通道的插座不一定那么这种方法首先会导致将套接字绑定到一个地址是自动分配的,如果调用bind
方法与null
参数。
dst
-缓冲区中的数据被转移
ClosedChannelException
-如果这通道关闭
AsynchronousCloseException
如果另一个线程关闭通道而读操作正在进行中
ClosedByInterruptException
如果另一个线程中断当前线程在读操作中,从而关闭通道和设置当前线程的中断状态
SecurityException
如果安全管理器已经安装,它不允许数据包被接受的报文的发送者
IOException
-如果其他I/O错误发生
public abstract int send(ByteBuffer src, SocketAddress target) throws IOException
如果这个渠道是非阻塞模式,有潜在的输出缓冲区有足够的空间,或者如果这个通道阻塞模式和足够的空间可用,然后在给定的缓冲区剩余的字节为一个单一的数据包到给定的目标地址发送。
数据报传输的字节缓冲区通过定期write
操作。
该方法具有完全相同的安全检查的DatagramSocket
班send
方法。即,如果套接字没有连接到一个特定的远程地址和安全管理器已经安装,然后为每个数据报发送这个方法验证目标地址和端口号由安全经理的checkConnect
方法允许。这个安全检查的开销可以通过第一连接插座通过connect
方法避免。
这种方法可能在任何时候被调用。如果另一个线程已经在这个通道上启动了一个写操作,那么这个方法的调用将阻塞,直到第一个操作完成。如果这个通道的插座不一定那么这种方法首先会导致将套接字绑定到一个地址是自动分配的,如果通过调用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
在渠道bound
到互联网协议的套接字地址然后从这个方法返回值的类型是InetSocketAddress
。
如果存在安全管理器,它的checkConnect
方法被调用的本地地址和-1
作为它的参数看看操作是允许的。如果操作是不允许的,一个SocketAddress
代表loopback
地址和本地端口的套接字通道返回。
getLocalAddress
接口
NetworkChannel
SocketAddress
,socket,或
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.