Module java.base
Package java.net

Class DatagramSocket

java.lang.Object
java.net.DatagramSocket
所有已实现的接口:
Closeable, AutoCloseable
直接已知的子类:
MulticastSocket

public class DatagramSocket extends Object implements Closeable
这个类表示用于发送和接收数据报包的套接字。

数据报套接字是数据包传递服务的发送或接收点。在数据报套接字上发送或接收的每个数据包都是单独寻址和路由的。从一台机器发送到另一台机器的多个数据包可能会被不同地路由,并且可能以任何顺序到达。

在可能的情况下,新构造的DatagramSocket已启用SO_BROADCAST套接字选项,以允许广播数据报的传输。为了接收广播数据包,应将数据报套接字绑定到通配符地址。在某些实现中,当数据报套接字绑定到更具体的地址时,也可以接收广播数据包。

示例:


              DatagramSocket s = new DatagramSocket(null);
              s.bind(new InetSocketAddress(8888));
 
这等效于:

              DatagramSocket s = new DatagramSocket(8888);
 
这两种情况都将创建一个能够在UDP端口8888上接收广播的DatagramSocket。

DatagramSocket类定义了方便的方法来设置和获取几个套接字选项。该类还定义了setOptiongetOption方法来设置和查询套接字选项。一个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的实例可用于发送或接收多播数据报。不需要加入多播组即可发送多播数据报。但是,在发送多播数据报之前,应首先使用setOptionStandardSocketOptions.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多播数据报的应用程序时,应考虑以下事项:

  1. DatagramChannel相反,DatagramSocket的构造函数不允许指定底层套接字的ProtocolFamily。因此,底层套接字的协议族可能不对应于DatagramSocket将尝试加入和接收多播数据报的多播组的协议族。
    不能保证在一个协议族中创建的DatagramSocket能够加入并接收发送到另一个协议族的多播组的多播数据报。例如,当一个DatagramSocket连接到IPv6套接字时,是否可以加入IPv4多播组并接收发送到该组的多播数据报是特定于实现的。
  2. 在加入多播组之前,DatagramSocket应该绑定到通配符地址。如果套接字绑定到特定地址而不是通配符地址,则是否接收多播数据报由实现决定。
  3. 在绑定套接字之前应启用SO_REUSEADDR选项。这是为了允许组的多个成员绑定到相同的地址。
自从:
1.0
参见:
  • Constructor Details

    • DatagramSocket

      public DatagramSocket() throws SocketException
      构造数据报套接字并将其绑定到本地主机上的任何可用端口。套接字将绑定到通配符地址。

      如果存在安全管理器,则首先使用0作为参数调用其checkListen方法以确保允许该操作。这可能导致SecurityException。

      抛出:
      SocketException - 如果无法打开套接字,或无法绑定套接字。
      SecurityException - 如果存在安全管理器且其checkListen方法不允许该操作。
      参见:
    • DatagramSocket

      protected DatagramSocket(DatagramSocketImpl impl)
      使用指定的DatagramSocketImpl创建未绑定的数据报套接字。
      参数:
      impl - 子类希望在DatagramSocket上使用的DatagramSocketImpl的实例。
      自:
      1.4
    • DatagramSocket

      public DatagramSocket(SocketAddress bindaddr) throws SocketException
      创建绑定到指定本地套接字地址的数据报套接字。

      如果地址为null,将创建一个未绑定的套接字。

      如果存在安全管理器,则首先使用套接字地址的端口作为参数调用其checkListen方法以确保允许该操作。这可能导致SecurityException。

      参数:
      bindaddr - 要绑定的本地套接字地址,或null表示未绑定套接字。
      抛出:
      SocketException - 如果无法打开套接字,或无法绑定到指定的本地端口。
      SecurityException - 如果存在安全管理器且其checkListen方法不允许该操作。
      IllegalArgumentException - 如果bindaddr是此套接字不支持的SocketAddress子类。
      自:
      1.4
      参见:
    • DatagramSocket

      public DatagramSocket(int port) throws SocketException
      创建数据报套接字并将其绑定到本地主机机器上指定的端口。套接字将绑定到通配符地址。

      如果存在安全管理器,则首先使用port参数调用其checkListen方法以确保允许该操作。这可能导致SecurityException。

      参数:
      port - 用于绑定操作的本地端口。
      抛出:
      SocketException - 如果无法打开套接字,或无法绑定到指定的本地端口。
      SecurityException - 如果存在安全管理器且其checkListen方法不允许该操作。
      IllegalArgumentException - 如果端口超出范围。
      参见:
    • DatagramSocket

      public DatagramSocket(int port, InetAddress laddr) throws SocketException
      创建绑定到指定本地地址的数据报套接字。

      本地端口必须在0和65535之间(包括65535)。端口号为将允许系统在bind操作中选择一个临时端口。

      如果IP地址是通配符地址,或为null,则套接字将绑定到通配符地址。

      如果存在安全管理器,则首先使用port参数调用其checkListen方法以确保允许该操作。这可能导致SecurityException。

      参数:
      port - 用于绑定操作的本地端口。
      laddr - 要绑定的本地地址(可以为null
      抛出:
      SocketException - 如果无法打开套接字,或无法绑定到指定的本地端口。
      SecurityException - 如果存在安全管理器且其checkListen方法不允许该操作。
      IllegalArgumentException - 如果端口超出范围。
      自:
      1.1
      参见:
  • Method Details

    • bind

      public void bind(SocketAddress addr) throws SocketException
      将此DatagramSocket绑定到特定地址和端口。

      如果地址为null,则系统将选择一个临时端口和一个有效的本地地址来绑定套接字。

      参数:
      addr - 要绑定到的地址和端口。
      抛出:
      SocketException - 如果在绑定期间发生任何错误,或者套接字已经绑定。
      SecurityException - 如果存在安全管理器且其checkListen方法不允许该操作。
      IllegalArgumentException - 如果addr是此套接字不支持的SocketAddress子类。
      自:
      1.4
    • connect

      public void connect(InetAddress address, int port)
      连接此套接字到远程地址。当套接字连接到远程地址时,数据包只能发送到该地址或从该地址接收。默认情况下,数据报套接字未连接。如果套接字已关闭,则此方法无效。

      如果此套接字未绑定,则此方法将首先导致套接字绑定到自动分配的地址,就好像使用参数为null调用bind方法一样。如果套接字连接到的远程目的地不存在,或者无法访问,并且如果已为该地址接收到ICMP目的地不可达数据包,则随后的发送或接收调用可能会引发PortUnreachableException异常。请注意,不能保证一定会抛出异常。

      如果已安装安全管理器,则将调用以检查对远程地址的访问权限。具体来说,如果给定的address是一个多播地址,则将使用给定的address调用安全管理器的checkMulticast方法。否则,将调用安全管理器的checkConnectcheckAccept方法,使用给定的addressport,以验证是否允许分别发送和接收数据报。

      应当注意确保连接的数据报套接字不与不受信任的代码共享。当套接字连接时,receivesend将不对传入和传出的数据包执行任何安全检查,除了匹配数据包的地址和套接字的地址和端口。在发送操作中,如果设置了数据包的地址并且数据包的地址与套接字的地址不匹配,则将抛出IllegalArgumentException异常。连接到多播地址的套接字只能用于发送数据包。在调用此方法之前未接收的套接字的套接字接收缓冲区中的数据报可能会被丢弃。

      参数:
      address - 套接字的远程地址
      port - 套接字的远程端口
      抛出:
      IllegalArgumentException - 如果地址为null,或端口超出范围
      SecurityException - 如果已安装安全管理器且不允许访问给定的远程地址
      UncheckedIOException - 如果连接失败,例如,如果目标地址不可路由
      自版本:
      1.2
      参见:
    • connect

      public void connect(SocketAddress addr) throws SocketException
      将此套接字连接到远程套接字地址(IP地址+端口号)。

      如果给定一个InetSocketAddress,则此方法的行为就像使用给定套接字地址的IP地址和端口号调用connect(InetAddress,int)一样,只是可能引发的SocketException未包装在UncheckedIOException中。在调用此方法之前未接收的套接字的套接字接收缓冲区中的数据报可能会被丢弃。

      参数:
      addr - 远程地址
      抛出:
      SocketException - 如果连接失败
      IllegalArgumentException - 如果addrnull,或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

      public InetAddress getInetAddress()
      返回此套接字连接的地址。如果套接字未连接,则返回null

      如果套接字在关闭之前已连接,则此方法在套接字关闭后仍将继续返回连接的地址。

      返回:
      此套接字连接的地址。
      自版本:
      1.2
    • getPort

      public int getPort()
      返回此套接字连接的端口号。如果套接字未连接,则返回-1

      如果套接字在关闭之前已连接,则此方法在套接字关闭后仍将继续返回连接的端口号。

      返回:
      此套接字连接的端口号。
      自版本:
      1.2
    • getRemoteSocketAddress

      public SocketAddress getRemoteSocketAddress()
      返回此套接字连接的端点地址,如果未连接则返回null

      如果套接字在关闭之前已连接,则此方法在套接字关闭后仍将继续返回连接的地址。

      返回:
      表示此套接字远程端点的SocketAddress,如果尚未连接则返回null
      自版本:
      1.4
      参见:
    • getLocalSocketAddress

      public SocketAddress getLocalSocketAddress()
      返回此套接字绑定到的端点地址。
      返回:
      表示此套接字本地端点的SocketAddress,如果已关闭或尚未绑定则返回null
      自版本:
      1.4
      参见:
    • send

      public void send(DatagramPacket p) throws IOException
      从此套接字发送数据报。 DatagramPacket包括指示要发送的数据、其长度、远程主机的IP地址和远程主机的端口号的信息。

      如果存在安全管理器,并且套接字当前未连接到远程地址,则此方法首先执行一些安全检查。首先,如果p.getAddress().isMulticastAddress()为true,则此方法将使用p.getAddress()调用安全管理器的checkMulticast方法作为其参数。如果该表达式的评估结果为false,则此方法将使用p.getAddress().getHostAddress()p.getPort()作为参数调用安全管理器的checkConnect方法。每次调用安全管理器方法都可能导致SecurityException,如果操作不允许。

      Parameters:
      p - the DatagramPacket to be sent.
      Throws:
      IOException - if an I/O error occurs.
      SecurityException - if a security manager exists and its checkMulticast or checkConnect 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

      public void receive(DatagramPacket p) throws IOException
      Receives a datagram packet from this socket. This method blocks until a datagram is received. When this method returns, the DatagramPacket'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. The length 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:

      1. 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 throw ClosedByInterruptException with the interrupt status set.
      2. 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 - the DatagramPacket 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:
    • getLocalAddress

      public InetAddress 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 an InetAddress representing wildcard address if either the socket is not bound, or the security manager checkConnect 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, or 0 if it is not bound yet.
    • setSoTimeout

      public void setSoTimeout(int timeout) throws SocketException
      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 - if timeout is negative
      Since:
      1.1
      See Also:
    • getSoTimeout

      public int getSoTimeout() throws SocketException
      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

      public void setSendBufferSize(int size) throws SocketException
      Sets the SO_SNDBUF option to the specified value for this DatagramSocket. 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 a DatagramPacket 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 calling setOption(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

      public int getSendBufferSize() throws SocketException
      Get value of the SO_SNDBUF option for this DatagramSocket, that is the buffer size, in bytes, used by the platform for output on this DatagramSocket.
      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

      public void setReceiveBufferSize(int size) throws SocketException
      Sets the SO_RCVBUF option to the specified value for this DatagramSocket. 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

      public int getReceiveBufferSize() throws SocketException
      获取此DatagramSocket的SO_RCVBUF选项的值,即平台用于该DatagramSocket的输入的缓冲区大小(以字节为单位)。
      API注释:
      此方法等效于调用getOption(StandardSocketOptions.SO_RCVBUF)
      返回:
      DatagramSocket的SO_RCVBUF选项的值
      抛出:
      SocketException - 如果底层协议中存在错误,例如UDP错误。
      自从:
      1.2
      参见:
    • setReuseAddress

      public void setReuseAddress(boolean on) throws SocketException
      启用/禁用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

      public boolean getReuseAddress() throws SocketException
      测试是否启用了SO_REUSEADDR。
      API注释:
      此方法等效于调用getOption(StandardSocketOptions.SO_REUSEADDR)
      返回:
      一个boolean,指示SO_REUSEADDR是否已启用。
      抛出:
      SocketException - 如果底层协议中存在错误,例如UDP错误。
      自从:
      1.4
      参见:
    • setBroadcast

      public void setBroadcast(boolean on) throws SocketException
      启用/禁用SO_BROADCAST。

      某些操作系统可能要求使用特定于实现的权限启动Java虚拟机以启用此选项或发送广播数据报。

      API注释:
      此方法等效于调用setOption(StandardSocketOptions.SO_BROADCAST, on)
      参数:
      on - 是否打开广播。
      抛出:
      SocketException - 如果底层协议中存在错误,例如UDP错误。
      自从:
      1.4
      参见:
    • getBroadcast

      public boolean getBroadcast() throws SocketException
      测试是否启用了SO_BROADCAST。
      API注释:
      此方法等效于调用getOption(StandardSocketOptions.SO_BROADCAST)
      返回:
      一个boolean,指示SO_BROADCAST是否已启用。
      抛出:
      SocketException - 如果底层协议中存在错误,例如UDP错误。
      自从:
      1.4
      参见:
    • setTrafficClass

      public void setTrafficClass(int tc) throws SocketException
      设置从此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)
      最后一个低位始终被忽略,因为这对应于MBZ(必须为零)位。

      设置优先级字段中的位可能导致SocketException,指示不允许该操作。

      对于Internet Protocol v6,tc是将放入IP头的sin6_flowinfo字段的值。

      API注释:
      此方法等效于调用setOption(StandardSocketOptions.IP_TOS, tc)
      参数:
      tc - 位集的int值。
      抛出:
      SocketException - 如果设置流量类别或服务类型时出现错误
      自从:
      1.4
      参见:
    • getTrafficClass

      public int getTrafficClass() throws SocketException
      获取从此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

      public DatagramChannel getChannel()
      返回与此数据报套接字关联的唯一DatagramChannel对象,如果有的话。

      只有当通道是通过DatagramChannel.open方法创建时,数据报套接字才会有一个通道。

      返回:
      与此数据报套接字关联的数据报通道,如果此套接字不是为通道创建的,则返回null
      自:
      1.4
    • setDatagramSocketImplFactory

      @Deprecated(since="17") public static void setDatagramSocketImplFactory(DatagramSocketImplFactory fac) throws IOException
      Deprecated.
      Use DatagramChannel, or subclass DatagramSocket directly.
      This method provided a way in early JDK releases to replace the system wide implementation of DatagramSocket. It has been mostly obsolete since Java 1.4. If required, a DatagramSocket can be created to use a custom implementation by extending DatagramSocket 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

      public <T> DatagramSocket setOption(SocketOption<T> name, T value) throws IOException
      设置套接字选项的值。
      类型参数:
      T - 套接字选项值的类型
      参数:
      name - 套接字选项
      value - 套接字选项的值。对于某些选项,null值可能有效。
      返回:
      此数据报套接字
      抛出:
      UnsupportedOperationException - 如果数据报套接字不支持该选项。
      IllegalArgumentException - 如果值对于该选项无效。
      IOException - 如果发生I/O错误,或者套接字已关闭。
      SecurityException - 如果设置了安全管理器,并且套接字选项需要安全权限,调用方没有所需的权限。StandardSocketOptions不需要任何安全权限。
      NullPointerException - 如果name为null
      自:
      9
    • getOption

      public <T> T getOption(SocketOption<T> name) throws IOException
      返回套接字选项的值。
      类型参数:
      T - 套接字选项值的类型
      参数:
      name - 套接字选项
      返回:
      套接字选项的值。
      抛出:
      UnsupportedOperationException - 如果数据报套接字不支持该选项。
      IOException - 如果发生I/O错误,或者套接字已关闭。
      NullPointerException - 如果name为null
      SecurityException - 如果设置了安全管理器,并且套接字选项需要安全权限,调用方没有所需的权限。StandardSocketOptions不需要任何安全权限。
      自:
      9
    • supportedOptions

      public Set<SocketOption<?>> supportedOptions()
      返回此套接字支持的套接字选项集。即使套接字已关闭,此方法仍将继续返回选项集。
      返回:
      此套接字支持的套接字选项集。如果套接字的DatagramSocketImpl无法创建,则此集合可能为空。
      自:
      9
    • joinGroup

      public void joinGroup(SocketAddress mcastaddr, NetworkInterface netIf) throws IOException
      加入多播组。

      为了加入多播组,调用者应指定要加入的多播组的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

      public void leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf) throws IOException
      在指定的本地接口上离开多播组。

      如果存在安全管理器,则此方法首先使用mcastaddr参数调用其checkMulticast方法。

      API注释:
      mcastaddrnetIf参数应标识先前由此DatagramSocket 加入的多播组。

      可以多次调用此方法以离开先前加入的多个不同多播组,或离开先前在多个不同网络中加入的相同组。但是,如果套接字不是指定网络中指定组的成员,则会抛出一个IOException

      参数:
      mcastaddr - 要离开的多播地址。这应该包含与加入组相同的IP地址。
      netIf - 指定本地接口或null以推迟到设置为传出多播数据报的接口。如果null,且未设置接口,则行为未指定:可能选择任何接口或操作可能因SocketException而失败。
      抛出:
      IOException - 如果离开时出现错误,或者地址不是多播地址。
      SecurityException - 如果存在安全管理器且其checkMulticast方法不允许该操作。
      IllegalArgumentException - 如果mcastaddr为null或是此套接字不支持的SocketAddress子类。
      自:
      17
      参见: