Module  java.base
软件包  java.net

Class DatagramSocket

  • All Implemented Interfaces:
    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);这两种情况都将创建一个DatagramSocket能够在UDP端口8888上接收广播。

    从以下版本开始:
    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 - 子类希望在DatagramSocket上使用的 DatagramSocketImpl的一个实例。
        从以下版本开始:
        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地址。

        如果有安全管理器,则首先调用其checkListen方法,其参数为port ,以确保操作是允许的。 这可能会导致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地址。

        如果有一个安全管理器,它的checkListen方法首先被调用,以port参数作为参数,以确保操作是允许的。 这可能会导致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。 注意,不能保证会抛出异常。

        如果已经安装了安全管理器,则调用它来检查对远程地址的访问。 具体来说,如果给定的address是一个multicast address ,安全管理员的checkMulticast方法将使用给定的address调用。 否则,将使用给定的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()为真,则该方法调用安全管理器的checkMulticast方法,其中参数为p.getAddress() 如果表达式的计算是错误的,这种方法改为调用安全管理器的checkConnect方法与参数p.getAddress().getHostAddress()p.getPort() 每次调用安全管理器方法都可能导致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​()
        返回此套接字绑定到的本地主机上的端口号。
        结果
        此套接字绑定的本地主机上的端口号, -1如果套接字被关闭,或者 0如果没有约束。
      • 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的行为(见isBound() )未定义。

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

        public boolean getReuseAddress​()
                                throws SocketException
        测试是否启用了SO_REUSEADDR。
        结果
        一个表示是否启用了SO_REUSEADDR的 boolean
        异常
        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。
        结果
        一个表示 boolean是否被使能的boolean。
        异常
        SocketException - 如果底层协议有错误,例如UDP错误。
        从以下版本开始:
        1.4
        另请参见:
        setBroadcast(boolean)
      • setTrafficClass

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

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

        笔记:

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

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

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

        对于互联网协议v6 tc是将被放置到IP头的sin6_flowinfo字段中的值。

        参数
        tc - 一个 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无法创建,则此集合可能为空。
        从以下版本开始:
        9