- 所有已实现的接口:
-
Closeable
,AutoCloseable
- 直接已知的子类:
-
MulticastSocket
数据报套接字是数据包传递服务的发送或接收点。在数据报套接字上发送或接收的每个数据包都是单独寻址和路由的。从一台机器发送到另一台机器的多个数据包可能会被不同地路由,并且可能以任何顺序到达。
在可能的情况下,新构造的DatagramSocket
已启用SO_BROADCAST
套接字选项,以允许广播数据报的传输。为了接收广播数据包,应将数据报套接字绑定到通配符地址。在某些实现中,当数据报套接字绑定到更具体的地址时,也可以接收广播数据包。
示例:
DatagramSocket s = new DatagramSocket(null);
s.bind(new InetSocketAddress(8888));
这等效于:
DatagramSocket s = new DatagramSocket(8888);
这两种情况都将创建一个能够在UDP端口8888上接收广播的DatagramSocket。
DatagramSocket
类定义了方便的方法来设置和获取几个套接字选项。该类还定义了setOption
和getOption
方法来设置和查询套接字选项。一个DatagramSocket
支持以下套接字选项:
选项名称 描述 SO_SNDBUF
套接字发送缓冲区的大小(以字节为单位) SO_RCVBUF
套接字接收缓冲区的大小(以字节为单位) SO_REUSEADDR
重用地址 SO_BROADCAST
允许传输广播数据报 IP_TOS
互联网协议(IP)头部中的服务类型(ToS)字节
此外,DatagramSocket
类定义了用于加入和离开多播组的方法,并支持多播选项,这在加入、离开或向多播组发送数据报时非常有用。支持以下多播选项:
一个实现也可能支持其他选项。
选项名称 描述 IP_MULTICAST_IF
互联网协议(IP)多播数据报的网络接口 IP_MULTICAST_TTL
互联网协议(IP)多播数据报的生存时间 IP_MULTICAST_LOOP
互联网协议(IP)多播数据报的环回
- API 注意:
-
使用DatagramSocket进行多播
DatagramChannel
实现了MulticastChannel
接口,并提供了一个用于发送和接收多播数据报的替代API。MulticastChannel
API支持任意源和特定源多播。考虑使用DatagramChannel
进行多播。DatagramSocket
可以直接用于多播。但是,与MulticastSocket
相反,DatagramSocket
默认不调用setReuseAddress(boolean)
方法来启用SO_REUSEADDR套接字选项。如果创建一个打算稍后加入多播组的DatagramSocket
,调用者应考虑显式启用SO_REUSEADDR选项。DatagramSocket
的实例可用于发送或接收多播数据报。不需要加入多播组即可发送多播数据报。但是,在发送多播数据报之前,应首先使用setOption
和StandardSocketOptions.IP_MULTICAST_IF
配置发送多播数据报的默认出口接口:DatagramSocket sender = new DatagramSocket(new InetSocketAddress(0)); NetworkInterface outgoingIf = NetworkInterface.getByName("en0"); sender.setOption(StandardSocketOptions.IP_MULTICAST_IF, outgoingIf); // 可选配置多播TTL;TTL定义了多播数据报的范围,例如,将其限制为主机本地(0)或链路本地(1)等... int ttl = ...; // 0到255之间的数字 sender.setOption(StandardSocketOptions.IP_MULTICAST_TTL, ttl); // 发送数据包到多播组 byte[] msgBytes = ...; InetAddress mcastaddr = InetAddress.getByName("228.5.6.7"); int port = 6789; InetSocketAddress dest = new InetSocketAddress(mcastaddr, port); DatagramPacket hi = new DatagramPacket(msgBytes, msgBytes.length, dest); sender.send(hi);
DatagramSocket
的实例也可用于接收多播数据报。创建用于接收多播数据报的DatagramSocket
应该是未绑定的。在绑定套接字之前,应该配置setReuseAddress(true)
:DatagramSocket socket = new DatagramSocket(null); // 未绑定 socket.setReuseAddress(true); // 绑定之前设置重用地址 socket.bind(new InetSocketAddress(6789)); // 绑定 // 加入组228.5.6.7 InetAddress mcastaddr = InetAddress.getByName("228.5.6.7"); InetSocketAddress group = new InetSocketAddress(mcastaddr, 0); NetworkInterface netIf = NetworkInterface.getByName("en0"); socket.joinGroup(group, netIf); byte[] msgBytes = new byte[1024]; // 最多1024字节 DatagramPacket packet = new DatagramPacket(msgBytes, msgBytes.length); socket.receive(packet); .... // 最终离开组 socket.leaveGroup(group, netIf);
多播实现旨在直接映射到本机多播功能。因此,在开发接收IP多播数据报的应用程序时,应考虑以下事项:
- 与
DatagramChannel
相反,DatagramSocket
的构造函数不允许指定底层套接字的ProtocolFamily
。因此,底层套接字的协议族可能不对应于DatagramSocket
将尝试加入和接收多播数据报的多播组的协议族。
不能保证在一个协议族中创建的DatagramSocket
能够加入并接收发送到另一个协议族的多播组的多播数据报。例如,当一个DatagramSocket
连接到IPv6套接字时,是否可以加入IPv4多播组并接收发送到该组的多播数据报是特定于实现的。 - 在加入多播组之前,
DatagramSocket
应该绑定到通配符地址。如果套接字绑定到特定地址而不是通配符地址,则是否接收多播数据报由实现决定。 - 在绑定套接字之前应启用SO_REUSEADDR选项。这是为了允许组的多个成员绑定到相同的地址。
- 与
- 自从:
- 1.0
- 参见:
-
Constructor Summary
ModifierConstructorDescription构造数据报套接字并将其绑定到本地主机机器上的任何可用端口。DatagramSocket
(int port) 构造数据报套接字并将其绑定到本地主机机器上指定的端口。DatagramSocket
(int port, InetAddress laddr) 创建一个绑定到指定本地地址的数据报套接字。protected
使用指定的DatagramSocketImpl创建一个未绑定的数据报套接字。DatagramSocket
(SocketAddress bindaddr) 创建一个绑定到指定本地套接字地址的数据报套接字。 -
Method Summary
Modifier and TypeMethodDescriptionvoid
bind
(SocketAddress addr) 将此DatagramSocket绑定到特定地址和端口。void
close()
关闭此数据报套接字。void
connect
(InetAddress address, int port) 将此套接字连接到此套接字的远程地址。void
connect
(SocketAddress addr) 将此套接字连接到远程套接字地址(IP地址+端口号)。void
断开套接字连接。boolean
测试是否启用了SO_BROADCAST。返回与此数据报套接字关联的唯一DatagramChannel
对象(如果有)。返回此套接字连接的地址。获取套接字绑定的本地地址。int
返回此套接字绑定到本地主机的端口号。返回此套接字绑定到的端点的地址。<T> T
getOption
(SocketOption<T> name) 返回套接字选项的值。int
getPort()
返回此套接字连接的端口号。int
获取此DatagramSocket
的SO_RCVBUF选项的值,即平台用于此DatagramSocket
输入的缓冲区大小(以字节为单位)。返回此套接字连接的端点的地址,如果未连接则返回null
。boolean
检查是否启用了SO_REUSEADDR。int
获取此DatagramSocket
的SO_SNDBUF选项的值,即平台用于此DatagramSocket
输出的缓冲区大小(以字节为单位)。int
检索SO_TIMEOUT的设置。返回0表示该选项已禁用(即超时为无限)。int
获取从此DatagramSocket发送的数据报的IP数据报头中的流量类别或服务类型。boolean
isBound()
返回套接字的绑定状态。boolean
isClosed()
返回套接字是否已关闭。boolean
返回套接字的连接状态。void
joinGroup
(SocketAddress mcastaddr, NetworkInterface netIf) 加入多播组。void
leaveGroup
(SocketAddress mcastaddr, NetworkInterface netIf) 在指定的本地接口上离开多播组。void
从此套接字接收数据报包。void
从此套接字发送数据报包。void
setBroadcast
(boolean on) 启用/禁用SO_BROADCAST。static void
已弃用。<T> DatagramSocket
setOption
(SocketOption<T> name, T value) 设置套接字选项的值。void
setReceiveBufferSize
(int size) 为此DatagramSocket
设置SO_RCVBUF选项的指定值。void
setReuseAddress
(boolean on) 启用/禁用SO_REUSEADDR套接字选项。void
setSendBufferSize
(int size) 为此DatagramSocket
设置SO_SNDBUF选项的指定值。void
setSoTimeout
(int timeout) 使用指定的超时(以毫秒为单位)启用/禁用SO_TIMEOUT。void
setTrafficClass
(int tc) 为从此DatagramSocket发送的数据报设置IP数据报头中的流量类别或服务类型。Set
<SocketOption<?>> 返回此套接字支持的套接字选项的集合。
-
Constructor Details
-
DatagramSocket
构造数据报套接字并将其绑定到本地主机上的任何可用端口。套接字将绑定到通配符
地址。如果存在安全管理器,则首先使用0作为参数调用其
checkListen
方法以确保允许该操作。这可能导致SecurityException。- 抛出:
-
SocketException
- 如果无法打开套接字,或无法绑定套接字。 -
SecurityException
- 如果存在安全管理器且其checkListen
方法不允许该操作。 - 参见:
-
DatagramSocket
使用指定的DatagramSocketImpl创建未绑定的数据报套接字。- 参数:
-
impl
- 子类希望在DatagramSocket上使用的DatagramSocketImpl的实例。 - 自:
- 1.4
-
DatagramSocket
创建绑定到指定本地套接字地址的数据报套接字。如果地址为
null
,将创建一个未绑定的套接字。如果存在安全管理器,则首先使用套接字地址的端口作为参数调用其
checkListen
方法以确保允许该操作。这可能导致SecurityException。- 参数:
-
bindaddr
- 要绑定的本地套接字地址,或null
表示未绑定套接字。 - 抛出:
-
SocketException
- 如果无法打开套接字,或无法绑定到指定的本地端口。 -
SecurityException
- 如果存在安全管理器且其checkListen
方法不允许该操作。 -
IllegalArgumentException
- 如果bindaddr是此套接字不支持的SocketAddress子类。 - 自:
- 1.4
- 参见:
-
DatagramSocket
创建数据报套接字并将其绑定到本地主机机器上指定的端口。套接字将绑定到通配符
地址。如果存在安全管理器,则首先使用
port
参数调用其checkListen
方法以确保允许该操作。这可能导致SecurityException。- 参数:
-
port
- 用于绑定操作的本地端口。 - 抛出:
-
SocketException
- 如果无法打开套接字,或无法绑定到指定的本地端口。 -
SecurityException
- 如果存在安全管理器且其checkListen
方法不允许该操作。 -
IllegalArgumentException
- 如果端口超出范围。 - 参见:
-
DatagramSocket
创建绑定到指定本地地址的数据报套接字。本地端口必须在0和65535之间(包括65535)。端口号为
零
将允许系统在bind
操作中选择一个临时端口。如果IP地址是
通配符
地址,或为null
,则套接字将绑定到通配符地址。如果存在安全管理器,则首先使用
port
参数调用其checkListen
方法以确保允许该操作。这可能导致SecurityException。- 参数:
-
port
- 用于绑定操作的本地端口。 -
laddr
- 要绑定的本地地址(可以为null
) - 抛出:
-
SocketException
- 如果无法打开套接字,或无法绑定到指定的本地端口。 -
SecurityException
- 如果存在安全管理器且其checkListen
方法不允许该操作。 -
IllegalArgumentException
- 如果端口超出范围。 - 自:
- 1.1
- 参见:
-
-
Method Details
-
bind
将此DatagramSocket绑定到特定地址和端口。如果地址为
null
,则系统将选择一个临时端口和一个有效的本地地址来绑定套接字。- 参数:
-
addr
- 要绑定到的地址和端口。 - 抛出:
-
SocketException
- 如果在绑定期间发生任何错误,或者套接字已经绑定。 -
SecurityException
- 如果存在安全管理器且其checkListen
方法不允许该操作。 -
IllegalArgumentException
- 如果addr是此套接字不支持的SocketAddress子类。 - 自:
- 1.4
-
connect
连接此套接字到远程地址。当套接字连接到远程地址时,数据包只能发送到该地址或从该地址接收。默认情况下,数据报套接字未连接。如果套接字已关闭,则此方法无效。如果此套接字未绑定,则此方法将首先导致套接字绑定到自动分配的地址,就好像使用参数为
null
调用bind
方法一样。如果套接字连接到的远程目的地不存在,或者无法访问,并且如果已为该地址接收到ICMP目的地不可达数据包,则随后的发送或接收调用可能会引发PortUnreachableException
异常。请注意,不能保证一定会抛出异常。如果已安装安全管理器,则将调用以检查对远程地址的访问权限。具体来说,如果给定的
address
是一个多播地址
,则将使用给定的address
调用安全管理器的checkMulticast
方法。否则,将调用安全管理器的checkConnect
和checkAccept
方法,使用给定的address
和port
,以验证是否允许分别发送和接收数据报。应当注意确保连接的数据报套接字不与不受信任的代码共享。当套接字连接时,
receive
和send
将不对传入和传出的数据包执行任何安全检查,除了匹配数据包的地址和套接字的地址和端口。在发送操作中,如果设置了数据包的地址并且数据包的地址与套接字的地址不匹配,则将抛出IllegalArgumentException
异常。连接到多播地址的套接字只能用于发送数据包。在调用此方法之前未接收的套接字的套接字接收缓冲区中的数据报可能会被丢弃。- 参数:
-
address
- 套接字的远程地址 -
port
- 套接字的远程端口 - 抛出:
-
IllegalArgumentException
- 如果地址为null,或端口超出范围 -
SecurityException
- 如果已安装安全管理器且不允许访问给定的远程地址 -
UncheckedIOException
- 如果连接失败,例如,如果目标地址不可路由 - 自版本:
- 1.2
- 参见:
-
connect
将此套接字连接到远程套接字地址(IP地址+端口号)。如果给定一个
InetSocketAddress
,则此方法的行为就像使用给定套接字地址的IP地址和端口号调用connect(InetAddress,int)
一样,只是可能引发的SocketException
未包装在UncheckedIOException
中。在调用此方法之前未接收的套接字的套接字接收缓冲区中的数据报可能会被丢弃。- 参数:
-
addr
- 远程地址 - 抛出:
-
SocketException
- 如果连接失败 -
IllegalArgumentException
- 如果addr
为null
,或addr
是此套接字不支持的SocketAddress子类 -
SecurityException
- 如果已安装安全管理器且不允许访问给定的远程地址 - 自版本:
- 1.4
-
disconnect
public void disconnect()断开套接字连接。如果套接字已关闭或未连接,则此方法无效。- API注释:
- 如果此方法引发UncheckedIOException,则套接字可能处于未指定状态。强烈建议在断开连接失败时关闭套接字。
- 抛出:
-
UncheckedIOException
- 如果断开连接失败无法解除关联并将套接字恢复到一致状态 - 自版本:
- 1.2
- 参见:
-
isBound
public boolean isBound()返回套接字的绑定状态。如果套接字在
关闭
之前已绑定,则此方法在套接字关闭后仍将继续返回true
。- 返回:
-
如果套接字成功绑定到地址,则返回
true
- 自版本:
- 1.4
-
isConnected
public boolean isConnected()返回套接字的连接状态。如果套接字在
关闭
之前已连接,则此方法在套接字关闭后仍将继续返回true
。- 返回:
-
如果套接字成功连接到服务器,则返回
true
- 自版本:
- 1.4
-
getInetAddress
返回此套接字连接的地址。如果套接字未连接,则返回null
。如果套接字在
关闭
之前已连接,则此方法在套接字关闭后仍将继续返回连接的地址。- 返回:
- 此套接字连接的地址。
- 自版本:
- 1.2
-
getPort
public int getPort()返回此套接字连接的端口号。如果套接字未连接,则返回-1
。如果套接字在
关闭
之前已连接,则此方法在套接字关闭后仍将继续返回连接的端口号。- 返回:
- 此套接字连接的端口号。
- 自版本:
- 1.2
-
getRemoteSocketAddress
返回此套接字连接的端点地址,如果未连接则返回null
。如果套接字在
关闭
之前已连接,则此方法在套接字关闭后仍将继续返回连接的地址。- 返回:
-
表示此套接字远程端点的
SocketAddress
,如果尚未连接则返回null
。 - 自版本:
- 1.4
- 参见:
-
getLocalSocketAddress
返回此套接字绑定到的端点地址。- 返回:
-
表示此套接字本地端点的
SocketAddress
,如果已关闭或尚未绑定则返回null
。 - 自版本:
- 1.4
- 参见:
-
send
从此套接字发送数据报。DatagramPacket
包括指示要发送的数据、其长度、远程主机的IP地址和远程主机的端口号的信息。如果存在安全管理器,并且套接字当前未连接到远程地址,则此方法首先执行一些安全检查。首先,如果
p.getAddress().isMulticastAddress()
为true,则此方法将使用p.getAddress()
调用安全管理器的checkMulticast
方法作为其参数。如果该表达式的评估结果为false,则此方法将使用p.getAddress().getHostAddress()
和p.getPort()
作为参数调用安全管理器的checkConnect
方法。每次调用安全管理器方法都可能导致SecurityException,如果操作不允许。- Parameters:
-
p
- theDatagramPacket
to be sent. - Throws:
-
IOException
- if an I/O error occurs. -
SecurityException
- if a security manager exists and itscheckMulticast
orcheckConnect
method doesn't allow the send. -
PortUnreachableException
- may be thrown if the socket is connected to a currently unreachable destination. Note, there is no guarantee that the exception will be thrown. -
IllegalBlockingModeException
- if this socket has an associated channel, and the channel is in non-blocking mode. -
IllegalArgumentException
- if the socket is connected, and connected address and packet address differ, or if the socket is not connected and the packet address is not set or if its port is out of range. - See Also:
-
receive
Receives a datagram packet from this socket. This method blocks until a datagram is received. When this method returns, theDatagramPacket
's buffer is filled with the data received. The datagram packet also contains the sender's IP address, and the port number on the sender's machine. Thelength
field of the datagram packet object contains the length of the received message. If the message is longer than the packet's length, the message is truncated.This method is interruptible in the following circumstances:
- The datagram socket is associated with a
DatagramChannel
. In that case, interrupting a thread receiving a datagram packet will close the underlying channel and cause this method to throwClosedByInterruptException
with the interrupt status set. - The datagram socket uses the system-default socket implementation and a virtual thread is receiving a datagram packet. In that case, interrupting the virtual thread will cause it to wakeup and close the socket. This method will then throw
SocketException
with the interrupt status set.
If there is a security manager, and the socket is not currently connected to a remote address, a packet cannot be received if the security manager's
checkAccept
method does not allow it. Datagrams that are not permitted by the security manager are silently discarded.- Parameters:
-
p
- theDatagramPacket
into which to place the incoming data. - Throws:
-
IOException
- if an I/O error occurs. -
SocketTimeoutException
- if setSoTimeout was previously called and the timeout has expired. -
PortUnreachableException
- may be thrown if the socket is connected to a currently unreachable destination. Note, there is no guarantee that the exception will be thrown. -
IllegalBlockingModeException
- if this socket has an associated channel, and the channel is in non-blocking mode. - See Also:
- The datagram socket is associated with a
-
getLocalAddress
Gets the local address to which the socket is bound.If there is a security manager, its
checkConnect
method is first called with the host address and-1
as its arguments to see if the operation is allowed.- Returns:
-
the local address to which the socket is bound,
null
if the socket is closed, or anInetAddress
representingwildcard
address if either the socket is not bound, or the security managercheckConnect
method does not allow the operation - Since:
- 1.1
- See Also:
-
getLocalPort
public int getLocalPort()Returns the port number on the local host to which this socket is bound.- Returns:
-
the port number on the local host to which this socket is bound,
-1
if the socket is closed, or0
if it is not bound yet.
-
setSoTimeout
Enable/disable SO_TIMEOUT with the specified timeout, in milliseconds. With this option set to a positive timeout value, a call to receive() for this DatagramSocket will block for only this amount of time. If the timeout expires, a java.net.SocketTimeoutException is raised, though the DatagramSocket is still valid. A timeout of zero is interpreted as an infinite timeout. The option must be enabled prior to entering the blocking operation to have effect.- Parameters:
-
timeout
- the specified timeout in milliseconds. - Throws:
-
SocketException
- if there is an error in the underlying protocol, such as an UDP error. -
IllegalArgumentException
- iftimeout
is negative - Since:
- 1.1
- See Also:
-
getSoTimeout
Retrieve setting for SO_TIMEOUT. 0 returns implies that the option is disabled (i.e., timeout of infinity).- Returns:
- the setting for SO_TIMEOUT
- Throws:
-
SocketException
- if there is an error in the underlying protocol, such as an UDP error. - Since:
- 1.1
- See Also:
-
setSendBufferSize
Sets the SO_SNDBUF option to the specified value for thisDatagramSocket
. The SO_SNDBUF option is used by the network implementation as a hint to size the underlying network I/O buffers. The SO_SNDBUF setting may also be used by the network implementation to determine the maximum size of the packet that can be sent on this socket.As SO_SNDBUF is a hint, applications that want to verify what size the buffer is should call
getSendBufferSize()
.Increasing the buffer size may allow multiple outgoing packets to be queued by the network implementation when the send rate is high.
Note: If
send(DatagramPacket)
is used to send aDatagramPacket
that is larger than the setting of SO_SNDBUF then it is implementation specific if the packet is sent or discarded.- API Note:
-
If
size > 0
, this method is equivalent to callingsetOption(StandardSocketOptions.SO_SNDBUF, size)
. - Parameters:
-
size
- the size to which to set the send buffer size, in bytes. This value must be greater than 0. - Throws:
-
SocketException
- if there is an error in the underlying protocol, such as an UDP error. -
IllegalArgumentException
- if the value is 0 or is negative. - Since:
- 1.2
- See Also:
-
getSendBufferSize
Get value of the SO_SNDBUF option for thisDatagramSocket
, that is the buffer size, in bytes, used by the platform for output on thisDatagramSocket
.- API Note:
-
This method is equivalent to calling
getOption(StandardSocketOptions.SO_SNDBUF)
. - Returns:
-
the value of the SO_SNDBUF option for this
DatagramSocket
- Throws:
-
SocketException
- if there is an error in the underlying protocol, such as an UDP error. - Since:
- 1.2
- See Also:
-
setReceiveBufferSize
Sets the SO_RCVBUF option to the specified value for thisDatagramSocket
. The SO_RCVBUF option is used by the network implementation as a hint to size the underlying network I/O buffers. The SO_RCVBUF setting may also be used by the network implementation to determine the maximum size of the packet that can be received on this socket.Because SO_RCVBUF is a hint, applications that want to verify what size the buffers were set to should call
getReceiveBufferSize()
.Increasing SO_RCVBUF may allow the network implementation to buffer multiple packets when packets arrive faster than are being received using
receive(DatagramPacket)
.Note: It is implementation specific if a packet larger than SO_RCVBUF can be received.
- API注释:
-
如果
size > 0
,则此方法等效于调用setOption(StandardSocketOptions.SO_RCVBUF, size)
。 - 参数:
-
size
- 要设置为的接收缓冲区大小(以字节为单位)。此值必须大于0。 - 抛出:
-
SocketException
- 如果底层协议中存在错误,例如UDP错误。 -
IllegalArgumentException
- 如果值为0或为负。 - 自从:
- 1.2
- 参见:
-
getReceiveBufferSize
获取此DatagramSocket
的SO_RCVBUF选项的值,即平台用于该DatagramSocket
的输入的缓冲区大小(以字节为单位)。- API注释:
-
此方法等效于调用
getOption(StandardSocketOptions.SO_RCVBUF)
。 - 返回:
-
此
DatagramSocket
的SO_RCVBUF选项的值 - 抛出:
-
SocketException
- 如果底层协议中存在错误,例如UDP错误。 - 自从:
- 1.2
- 参见:
-
setReuseAddress
启用/禁用SO_REUSEADDR套接字选项。对于UDP套接字,可能需要将多个套接字绑定到相同的套接字地址。这通常是为了接收多播数据包(请参见
MulticastSocket
)。如果在使用bind(SocketAddress)
绑定套接字之前启用了SO_REUSEADDR
套接字选项,则允许将多个套接字绑定到相同的套接字地址。注意:并非所有现有平台都支持此功能,因此具体实现是否会忽略此选项是特定于实现的。但是,如果不支持,则
getReuseAddress()
将始终返回false
。创建
DatagramSocket
时,SO_REUSEADDR
的初始设置为禁用。在绑定套接字后(请参见
isBound()
),启用或禁用SO_REUSEADDR
时的行为未定义。- API注释:
-
此方法等效于调用
setOption(StandardSocketOptions.SO_REUSEADDR, on)
。 - 参数:
-
on
- 是否启用或禁用 - 抛出:
-
SocketException
- 如果启用或禁用SO_REUSEADDR
套接字选项时发生错误,或套接字已关闭。 - 自从:
- 1.4
- 参见:
-
getReuseAddress
测试是否启用了SO_REUSEADDR。- API注释:
-
此方法等效于调用
getOption(StandardSocketOptions.SO_REUSEADDR)
。 - 返回:
-
一个
boolean
,指示SO_REUSEADDR是否已启用。 - 抛出:
-
SocketException
- 如果底层协议中存在错误,例如UDP错误。 - 自从:
- 1.4
- 参见:
-
setBroadcast
启用/禁用SO_BROADCAST。某些操作系统可能要求使用特定于实现的权限启动Java虚拟机以启用此选项或发送广播数据报。
- API注释:
-
此方法等效于调用
setOption(StandardSocketOptions.SO_BROADCAST, on)
。 - 参数:
-
on
- 是否打开广播。 - 抛出:
-
SocketException
- 如果底层协议中存在错误,例如UDP错误。 - 自从:
- 1.4
- 参见:
-
getBroadcast
测试是否启用了SO_BROADCAST。- API注释:
-
此方法等效于调用
getOption(StandardSocketOptions.SO_BROADCAST)
。 - 返回:
-
一个
boolean
,指示SO_BROADCAST是否已启用。 - 抛出:
-
SocketException
- 如果底层协议中存在错误,例如UDP错误。 - 自从:
- 1.4
- 参见:
-
setTrafficClass
设置从此DatagramSocket发送的数据报的IP数据报头中的流量类别或服务类型字节。由于底层网络实现可能会忽略此值,因此应用程序应将其视为提示。tc必须在范围
0 <= tc <= 255
内,否则将抛出IllegalArgumentException。注意:
对于Internet Protocol v4,该值由一个整数组成,其中最低有效的8位表示套接字发送的IP数据包中TOS字节的值。RFC 1349定义了TOS值如下:
IPTOS_LOWCOST (0x02)
IPTOS_RELIABILITY (0x04)
IPTOS_THROUGHPUT (0x08)
IPTOS_LOWDELAY (0x10)
设置优先级字段中的位可能导致SocketException,指示不允许该操作。
对于Internet Protocol v6,
tc
是将放入IP头的sin6_flowinfo字段的值。- API注释:
-
此方法等效于调用
setOption(StandardSocketOptions.IP_TOS, tc)
。 - 参数:
-
tc
- 位集的int
值。 - 抛出:
-
SocketException
- 如果设置流量类别或服务类型时出现错误 - 自从:
- 1.4
- 参见:
-
getTrafficClass
获取从此DatagramSocket发送的数据包的IP数据报头中的流量类别或服务类型。由于底层网络实现可能会忽略使用setTrafficClass(int)
设置的流量类别或服务类型,因此此方法可能返回与之前使用setTrafficClass(int)
方法在此DatagramSocket上设置的值不同的值。- API注释:
-
此方法等效于调用
getOption(StandardSocketOptions.IP_TOS)
。 - 返回:
- 已设置的流量类别或服务类型
- 抛出:
-
SocketException
- 如果获取流量类别或服务类型值时出现错误。 - 自从:
- 1.4
- 参见:
-
close
public void close()关闭此数据报套接字。任何当前在此套接字上阻塞在
receive(java.net.DatagramPacket)
中的线程将抛出
。SocketException
如果此套接字有关联的通道,则通道也将关闭。
- 指定者:
-
close
在接口AutoCloseable
中 - 指定者:
-
close
在接口Closeable
中
-
isClosed
public boolean isClosed()返回套接字是否已关闭。- 返回:
- 如果套接字已关闭,则为true
- 自从:
- 1.4
-
getChannel
返回与此数据报套接字关联的唯一DatagramChannel
对象,如果有的话。只有当通道是通过
DatagramChannel.open
方法创建时,数据报套接字才会有一个通道。- 返回:
-
与此数据报套接字关联的数据报通道,如果此套接字不是为通道创建的,则返回
null
。 - 自:
- 1.4
-
setDatagramSocketImplFactory
@Deprecated(since="17") public static void setDatagramSocketImplFactory(DatagramSocketImplFactory fac) throws IOException Deprecated.UseDatagramChannel
, or subclassDatagramSocket
directly.
This method provided a way in early JDK releases to replace the system wide implementation ofDatagramSocket
. It has been mostly obsolete since Java 1.4. If required, aDatagramSocket
can be created to use a custom implementation by extendingDatagramSocket
and using the protected constructor that takes an implementation as a parameter.为应用程序设置数据报套接字实现工厂。工厂只能指定一次。当应用程序创建新的数据报套接字时,将调用套接字实现工厂的
createDatagramSocketImpl
方法来创建实际的数据报套接字实现。将
null
传递给该方法是一个空操作,除非已经设置了工厂。如果存在安全管理器,则此方法首先调用安全管理器的
checkSetFactory
方法以确保允许该操作。这可能导致SecurityException。- 参数:
-
fac
- 所需的工厂。 - 抛出:
-
IOException
- 如果设置数据报套接字工厂时发生I/O错误。 -
SocketException
- 如果已经定义了工厂。 -
SecurityException
- 如果存在安全管理器且其checkSetFactory
方法不允许该操作。 - 自:
- 1.3
- 参见:
-
setOption
设置套接字选项的值。- 类型参数:
-
T
- 套接字选项值的类型 - 参数:
-
name
- 套接字选项 -
value
- 套接字选项的值。对于某些选项,null
值可能有效。 - 返回:
- 此数据报套接字
- 抛出:
-
UnsupportedOperationException
- 如果数据报套接字不支持该选项。 -
IllegalArgumentException
- 如果值对于该选项无效。 -
IOException
- 如果发生I/O错误,或者套接字已关闭。 -
SecurityException
- 如果设置了安全管理器,并且套接字选项需要安全权限,调用方没有所需的权限。StandardSocketOptions
不需要任何安全权限。 -
NullPointerException
- 如果name为null
- 自:
- 9
-
getOption
返回套接字选项的值。- 类型参数:
-
T
- 套接字选项值的类型 - 参数:
-
name
- 套接字选项 - 返回:
- 套接字选项的值。
- 抛出:
-
UnsupportedOperationException
- 如果数据报套接字不支持该选项。 -
IOException
- 如果发生I/O错误,或者套接字已关闭。 -
NullPointerException
- 如果name为null
-
SecurityException
- 如果设置了安全管理器,并且套接字选项需要安全权限,调用方没有所需的权限。StandardSocketOptions
不需要任何安全权限。 - 自:
- 9
-
supportedOptions
返回此套接字支持的套接字选项集。即使套接字已关闭,此方法仍将继续返回选项集。- 返回:
- 此套接字支持的套接字选项集。如果套接字的DatagramSocketImpl无法创建,则此集合可能为空。
- 自:
- 9
-
joinGroup
加入多播组。为了加入多播组,调用者应指定要加入的多播组的IP地址,以及接收多播数据包的本地网络接口。
mcastaddr
参数指示要加入的多播组的IP地址。出于历史原因,这被指定为SocketAddress
。默认实现仅支持InetSocketAddress
,并且忽略port
信息。netIf
参数指定接收多播数据报包的本地接口,或null
以推迟到设置为传出多播数据报的接口。如果null
,且未设置接口,则行为未指定:可能选择任何接口或操作可能因SocketException
而失败。
可以多次调用此方法以加入多个不同的多播组,或在多个不同网络中加入相同的组。但是,如果套接字已经是组的成员,则会抛出一个
IOException
。如果存在安全管理器,则此方法首先使用
mcastaddr
参数调用其checkMulticast
方法。- API注释:
-
可以使用
setOption(SocketOption, Object)
配置发送传出多播数据报的默认接口为StandardSocketOptions.IP_MULTICAST_IF
。 - 参数:
-
mcastaddr
- 指示要加入的多播地址。 -
netIf
- 指定接收多播数据报包的本地接口,或null
。 - 抛出:
-
IOException
- 如果加入时出现错误,或者地址不是多播地址,或平台不支持多播 -
SecurityException
- 如果存在安全管理器且其checkMulticast
方法不允许加入。 -
IllegalArgumentException
- 如果mcastaddr为null
或是此套接字不支持的SocketAddress子类 - 自:
- 17
- 参见:
-
leaveGroup
在指定的本地接口上离开多播组。如果存在安全管理器,则此方法首先使用
mcastaddr
参数调用其checkMulticast
方法。- API注释:
-
mcastaddr
和netIf
参数应标识先前由此DatagramSocket
加入的多播组。可以多次调用此方法以离开先前加入的多个不同多播组,或离开先前在多个不同网络中加入的相同组。但是,如果套接字不是指定网络中指定组的成员,则会抛出一个
IOException
。 - 参数:
-
mcastaddr
- 要离开的多播地址。这应该包含与加入
组相同的IP地址。 -
netIf
- 指定本地接口或null
以推迟到设置为传出多播数据报的接口。如果null
,且未设置接口,则行为未指定:可能选择任何接口或操作可能因SocketException
而失败。 - 抛出:
-
IOException
- 如果离开时出现错误,或者地址不是多播地址。 -
SecurityException
- 如果存在安全管理器且其checkMulticast
方法不允许该操作。 -
IllegalArgumentException
- 如果mcastaddr为null
或是此套接字不支持的SocketAddress子类。 - 自:
- 17
- 参见:
-
DatagramChannel
或直接子类化DatagramSocket
。