模块  java.base
软件包  java.net

Class DatagramSocket

  • 实现的所有接口
    CloseableAutoCloseable
    已知直接子类:
    MulticastSocket

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

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

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

    示例: DatagramSocket s = new DatagramSocket(null); s.bind(new InetSocketAddress(8888));相当于: DatagramSocket s = new DatagramSocket(8888);这两种情况都将创建一个能够在UDP端口8888上接收广播的DatagramSocket。

    从以下版本开始:
    1.0
    另请参见:
    DatagramPacketDatagramChannel
    • 构造方法详细信息

      • DatagramSocket

        public DatagramSocket()
                       throws SocketException
        构造一个数据报套接字并将其绑定到本地主机上的任何可用端口。 套接字将绑定到wildcard地址,即内核选择的IP地址。

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

        异常
        SocketException - 如果无法打开套接字,或者套接字无法绑定到指定的本地端口。
        SecurityException - 如果存在安全管理器且其 checkListen方法不允许该操作。
        另请参见:
        SecurityManager.checkListen(int)
      • DatagramSocket

        protected DatagramSocket​(DatagramSocketImpl impl)
        使用指定的DatagramSocketImpl创建未绑定的数据报套接字。
        参数
        impl -一个 的DatagramSocketImpl的子类希望在DatagramSocket的使用的一个实例。
        从以下版本开始:
        1.4
      • DatagramSocket

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

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

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

        参数
        bindaddr - 要绑定的本地套接字地址,或 null用于未绑定的套接字。
        异常
        SocketException - 如果无法打开套接字,或者套接字无法绑定到指定的本地端口。
        SecurityException - 如果存在安全管理器且其 checkListen方法不允许该操作。
        从以下版本开始:
        1.4
        另请参见:
        SecurityManager.checkListen(int)
      • DatagramSocket

        public DatagramSocket​(int port)
                       throws SocketException
        构造一个数据报套接字并将其绑定到本地主机上的指定端口。 套接字将绑定到wildcard地址,该地址是内核选择的IP地址。

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

        参数
        port - 要使用的端口。
        异常
        SocketException - 如果无法打开套接字,或者套接字无法绑定到指定的本地端口。
        SecurityException - 如果存在安全管理器且其 checkListen方法不允许该操作。
        另请参见:
        SecurityManager.checkListen(int)
      • DatagramSocket

        public DatagramSocket​(int port,
                              InetAddress laddr)
                       throws SocketException
        创建绑定到指定本地地址的数据报套接字。 本地端口必须介于0和65535之间。 如果IP地址为0.0.0.0,则套接字将绑定到wildcard地址,即内核选择的IP地址。

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

        参数
        port - 要使用的本地端口
        laddr - 要绑定的本地地址
        异常
        SocketException - 如果无法打开套接字,或者套接字无法绑定到指定的本地端口。
        SecurityException - 如果存在安全管理器且其 checkListen方法不允许该操作。
        从以下版本开始:
        1.1
        另请参见:
        SecurityManager.checkListen(int)
    • 方法详细信息

      • 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)
        将套接字连接到此套接字的远程地址。 当套接字连接到远程地址时,只能将数据包发送到该地址或从该地址接收数据包。 默认情况下,未连接数据报套接字。

        如果套接字所连接的远程目标不存在,或者无法访问,并且如果已收到该地址的ICMP目标不可达数据包,则后续调用发送或接收可能会抛出PortUnreachableException。 注意,不保证会抛出异常。

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

        连接套接字时, receivesend 不会对传入和传出的数据包执行任何安全检查 ,除了匹配数据包和套接字的地址和端口。 在发送操作中,如果数据包的地址已设置且数据包的地址与套接字地址不匹配,则将引发IllegalArgumentException 连接到多播地址的套接字只能用于发送数据包。

        参数
        address - 套接字的远程地址
        port - 套接字的远程端口。
        异常
        IllegalArgumentException - 如果地址为空,或者端口超出范围。
        SecurityException - 如果已安装安全管理器且不允许访问给定的远程地址
        另请参见:
        disconnect()
      • isBound

        public boolean isBound()
        返回套接字的绑定状态。

        如果套接字在closed之前被绑定 ,则在套接字关闭后此方法将继续返回true

        结果
        如果套接字成功绑定到某个地址,则为true
        从以下版本开始:
        1.4
      • isConnected

        public boolean isConnected()
        返回套接字的连接状态。

        如果套接字在closed之前已连接,则此方法将在套接字关闭后继续返回true

        结果
        如果套接字成功连接到服务器,则为true
        从以下版本开始:
        1.4
      • getInetAddress

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

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

        结果
        此套接字连接的地址。
      • getPort

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

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

        结果
        此套接字连接的端口号。
      • getRemoteSocketAddress

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

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

        结果
        SocketAddress表示此套接字的远程端点,如果尚未连接, null
        从以下版本开始:
        1.4
        另请参见:
        getInetAddress()getPort()connect(SocketAddress)
      • getLocalSocketAddress

        public SocketAddress getLocalSocketAddress()
        返回此套接字绑定的端点的地址。
        结果
        SocketAddress表示此套接字的本地端点,如果它已关闭或尚未绑定, null
        从以下版本开始:
        1.4
        另请参见:
        getLocalAddress()getLocalPort()bind(SocketAddress)
      • 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。

        参数
        p - 要发送的 DatagramPacket
        异常
        IOException - 如果发生I / O错误。
        SecurityException - 如果存在安全管理器且其 checkMulticastcheckConnect方法不允许发送。
        PortUnreachableException - 如果套接字连接到当前无法访问的目标,则可能抛出此异常。 注意,不保证会抛出异常。
        IllegalBlockingModeException - 如果此套接字具有关联的通道,并且通道处于非阻塞模式。
        IllegalArgumentException - 如果套接字已连接,并且连接的地址和数据包地址不同。
        另请参见:
        DatagramPacketSecurityManager.checkMulticast(InetAddress)SecurityManager.checkConnect(java.lang.String, int)
      • receive

        public void receive​(DatagramPacket p)
                     throws IOException
        从此套接字接收数据报包。 当此方法返回时, DatagramPacket的缓冲区将填充接收的数据。 数据报包还包含发送方的IP地址和发送方机器上的端口号。

        此方法将阻塞,直到收到数据报。 数据报包对象的length字段包含接收消息的长度。 如果消息长于数据包的长度,则消息将被截断。

        如果存在安全管理器,则如果安全管理器checkAccept方法不允许,则无法接收数据包。

        参数
        p - 将传入数据放入其中的 DatagramPacket
        异常
        IOException - 如果发生I / O错误。
        SocketTimeoutException - 如果先前已调用setSoTimeout且超时已到期。
        PortUnreachableException - 如果套接字连接到当前无法访问的目标,则可能抛出此异常。 注意,不保证会抛出异常。
        IllegalBlockingModeException - 如果此套接字具有关联的通道,并且通道处于非阻塞模式。
        另请参见:
        DatagramPacketDatagramSocket
      • getLocalAddress

        public InetAddress getLocalAddress()
        获取套接字绑定的本地地址。

        如果有安全管理器,则首先使用主机地址调用其checkConnect方法,并将-1作为其参数,以查看是否允许该操作。

        结果
        本地地址到套接字绑定, null如果套接字被关闭,或 InetAddress表示 wildcard地址如果任一插座不结合,或安全管理器 checkConnect方法不允许该操作
        从以下版本开始:
        1.1
        另请参见:
        SecurityManager.checkConnect(java.lang.String, int)
      • getLocalPort

        public int getLocalPort()
        返回此套接字绑定到的本地主机上的端口号。
        结果
        此套接字绑定到的本地主机上的端口号,如果套接字已关闭, 0如果尚未绑定, -1
      • setSoTimeout

        public void setSoTimeout​(int timeout)
                          throws SocketException
        使用指定的超时启用/禁用SO_TIMEOUT,以毫秒为单位。 如果将此选项设置为非零超时,则对此DatagramSocket的receive()调用将仅阻止这段时间。 如果超时到期,则引发java.net.SocketTimeoutException ,尽管DatagramSocket仍然有效。 必须在进入阻止操作之前启用该选项才能生效。 超时时间必须为> 0 超时为零被解释为无限超时。
        参数
        timeout - 指定的超时(以毫秒为单位)。
        异常
        SocketException - 如果底层协议中存在错误,例如UDP错误。
        从以下版本开始:
        1.1
        另请参见:
        getSoTimeout()
      • getSoTimeout

        public int getSoTimeout()
                         throws SocketException
        检索SO_TIMEOUT的设置。 0返回意味着该选项被禁用(即无穷大的超时)。
        结果
        SO_TIMEOUT的设置
        异常
        SocketException - 如果底层协议中存在错误,例如UDP错误。
        从以下版本开始:
        1.1
        另请参见:
        setSoTimeout(int)
      • setSendBufferSize

        public void setSendBufferSize​(int size)
                               throws SocketException
        将SO_SNDBUF选项设置为此DatagramSocket的指定值。 网络实现使用SO_SNDBUF选项作为调整底层网络I / O缓冲区大小的提示。 SO_SNDBUF设置也可以由网络实现用于确定可以在该套接字上发送的分组的最大大小。

        由于SO_SNDBUF是一个提示,想要验证缓冲区大小的应用程序应该调用getSendBufferSize()

        当发送速率高时,增加缓冲区大小可允许网络实现将多个输出分组排队。

        注意:如果使用send(DatagramPacket)发送大于SO_SNDBUF设置的DatagramPacket ,则在发送或丢弃数据包时它是特定于实现的。

        参数
        size - 设置发送缓冲区大小的大小。 该值必须大于0。
        异常
        SocketException - 如果底层协议中存在错误,例如UDP错误。
        IllegalArgumentException - 如果值为0或为负数。
        另请参见:
        getSendBufferSize()
      • getSendBufferSize

        public int getSendBufferSize()
                              throws SocketException
        获取此 DatagramSocket的SO_SNDBUF选项的值,即该平台在此 DatagramSocket上用于输出的缓冲区大小。
        结果
        DatagramSocket的SO_SNDBUF选项的值
        异常
        SocketException - 如果底层协议中存在错误,例如UDP错误。
        另请参见:
        setSendBufferSize(int)
      • setReceiveBufferSize

        public void setReceiveBufferSize​(int size)
                                  throws SocketException
        将SO_RCVBUF选项设置为此DatagramSocket的指定值。 网络实现使用SO_RCVBUF选项作为调整底层网络I / O缓冲区大小的提示。 SO_RCVBUF设置也可以由网络实现用于确定可以在该套接字上接收的分组的最大大小。

        因为SO_RCVBUF是一个提示,想要验证缓冲区设置大小的应用程序应该调用getReceiveBufferSize()

        增加SO_RCVBUF可以允许网络实现在数据包到达速度快于使用receive(DatagramPacket)接收时缓冲多个数据包。

        注意:如果可以接收大于SO_RCVBUF的数据包,则它是特定于实现的。

        参数
        size - 设置接收缓冲区大小的大小。 该值必须大于0。
        异常
        SocketException - 如果底层协议中存在错误,例如UDP错误。
        IllegalArgumentException - 如果值为0或为负数。
        另请参见:
        getReceiveBufferSize()
      • getReceiveBufferSize

        public int getReceiveBufferSize()
                                 throws SocketException
        获取此 DatagramSocket的SO_RCVBUF选项的值,该平台用于此 DatagramSocket上的输入的缓冲区大小。
        结果
        DatagramSocket的SO_RCVBUF选项的值
        异常
        SocketException - 如果底层协议中存在错误,例如UDP错误。
        另请参见:
        setReceiveBufferSize(int)
      • setReuseAddress

        public void setReuseAddress​(boolean on)
                             throws SocketException
        启用/禁用SO_REUSEADDR套接字选项。

        对于UDP套接字,可能需要将多个套接字绑定到同一套接字地址。 这通常用于接收多播数据包(参见MulticastSocket )。 如果在使用bind(SocketAddress)绑定套接字之前启用了SO_REUSEADDR套接字选项,则SO_REUSEADDR套接字选项允许将多个套接字绑定到同一套接字地址。

        注意:所有现有平台都不支持此功能,因此无论是否忽略此选项,都是特定于实现的。 但是,如果不支持,则getReuseAddress()将始终返回false

        DatagramSocket被创建的初始设定SO_REUSEADDR被禁用。

        SO_REUSEADDR绑定套接字后启用或禁用SO_REUSEADDR时的行为(请参阅isBound() )。

        参数
        on - 是否启用或禁用
        异常
        SocketException - 如果在启用或禁用 SO_RESUEADDR套接字选项时发生错误,或者套接字已关闭。
        从以下版本开始:
        1.4
        另请参见:
        getReuseAddress()bind(SocketAddress)isBound()isClosed()
      • getReuseAddress

        public boolean getReuseAddress()
                                throws SocketException
        测试是否启用了SO_REUSEADDR。
        结果
        a boolean指示是否已启用SO_REUSEADDR。
        异常
        SocketException - 如果底层协议中存在错误,例如UDP错误。
        从以下版本开始:
        1.4
        另请参见:
        setReuseAddress(boolean)
      • setBroadcast

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

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

        参数
        on - 是否开启广播。
        异常
        SocketException - 如果底层协议中存在错误,例如UDP错误。
        从以下版本开始:
        1.4
        另请参见:
        getBroadcast()
      • getBroadcast

        public boolean getBroadcast()
                             throws SocketException
        测试是否启用了SO_BROADCAST。
        结果
        a boolean指示是否启用了SO_BROADCAST。
        异常
        SocketException - 如果底层协议中存在错误,例如UDP错误。
        从以下版本开始:
        1.4
        另请参见:
        setBroadcast(boolean)
      • setTrafficClass

        public void setTrafficClass​(int tc)
                             throws SocketException
        在IP数据报头中为从此DatagramSocket发送的数据报设置流量类或服务类型八位字节。 由于底层网络实现可能会忽略此值,因此应用程序应将其视为提示。

        tc 必须0 <= tc <= 255范围内, 0 <= tc <= 255将抛出IllegalArgumentException。

        笔记:

        对于Internet协议v4,该值由integer组成,其中最低有效8位表示套接字发送的IP数据包中TOS八位字节的值。 RFC 1349定义TOS值如下:

        • IPTOS_LOWCOST (0x02)
        • IPTOS_RELIABILITY (0x04)
        • IPTOS_THROUGHPUT (0x08)
        • IPTOS_LOWDELAY (0x10)
        始终忽略最后一个低位,因为这对应于MBZ(必须为零)位。

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

        对于Internet协议v6 tc是将放入IP标头的sin6_flowinfo字段的值。

        参数
        tc - bitset的值为 int
        异常
        SocketException - 如果设置流量类别或服务类型时出错
        从以下版本开始:
        1.4
        另请参见:
        getTrafficClass()
      • getTrafficClass

        public int getTrafficClass()
                            throws SocketException
        获取从此DatagramSocket发送的数据包的IP数据报头中的流量类或服务类型。

        由于底层网络实现可能会忽略使用setTrafficClass(int)的流量类或服务类型集, 因此此方法可能返回与先前在此DatagramSocket上使用setTrafficClass(int)方法设置的值不同的值。

        结果
        已设置的流量类别或服务类型
        异常
        SocketException - 如果获取流量类或服务类型值时出错。
        从以下版本开始:
        1.4
        另请参见:
        setTrafficClass(int)
      • isClosed

        public boolean isClosed()
        返回套接字是否关闭。
        结果
        如果套接字已关闭,则为true
        从以下版本开始:
        1.4
      • getChannel

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

        当且仅当通道本身是通过DatagramChannel.open方法创建时,数据报套接字才会有通道。

        结果
        与此数据报套接字关联的数据报通道,如果未为通道创建此套接字, null
        从以下版本开始:
        1.4
      • setDatagramSocketImplFactory

        public static void setDatagramSocketImplFactory​(DatagramSocketImplFactory fac)
                                                 throws IOException
        设置应用程序的数据报套接字实现工厂。 工厂只能指定一次。

        当应用程序创建新的数据报套接字时,将调用套接字实现工厂的createDatagramSocketImpl方法来创建实际的数据报套接字实现。

        除非工厂已经设置,否则将null传递给该方法是无操作的。

        如果存在安全管理器,则此方法首先调用安全管理器的checkSetFactory方法以确保允许操作。 这可能会导致SecurityException。

        参数
        fac - 所需的工厂。
        异常
        IOException - 如果在设置数据报套接字工厂时发生I / O错误。
        SocketException - 如果已定义工厂。
        SecurityException - 如果存在安全管理器且其 checkSetFactory方法不允许该操作。
        从以下版本开始:
        1.3
        另请参见:
        DatagramSocketImplFactory.createDatagramSocketImpl()SecurityManager.checkSetFactory()
      • getOption

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

        public Set<SocketOption<?>> supportedOptions()
        返回此套接字支持的一组套接字选项。 即使在套接字关闭后,此方法仍将继续返回选项集。
        结果
        此套接字支持的一组套接字选项。 如果无法创建套接字的DatagramSocketImpl,则此set可能为空。
        从以下版本开始:
        9