Most visited

Recently visited

Added in API level 1

DatagramSocket

public class DatagramSocket
extends Object implements Closeable

java.lang.Object
   ↳ java.net.DatagramSocket
Known Direct Subclasses


这个类表示一个用于发送和接收数据报包的套接字。

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

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

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

也可以看看:

Summary

Public constructors

DatagramSocket()

构造一个数据报套接字并将其绑定到本地主机上的任何可用端口。

DatagramSocket(SocketAddress bindaddr)

创建绑定到指定本地套接字地址的数据报套接字。

DatagramSocket(int port)

构造一个数据报套接字并将其绑定到本地主机上的指定端口。

DatagramSocket(int port, InetAddress laddr)

创建绑定到指定本地地址的数据报套接字。

Protected constructors

DatagramSocket(DatagramSocketImpl impl)

用指定的DatagramSocketImpl创建一个未绑定的数据报套接字。

Public methods

void bind(SocketAddress addr)

将此DatagramSocket绑定到特定的地址和端口。

void close()

关闭此数据报套接字。

void connect(InetAddress address, int port)

将套接字连接到此套接字的远程地址。

void connect(SocketAddress addr)

将此套接字连接到远程套接字地址(IP地址+端口号)。

void disconnect()

断开插座。

boolean getBroadcast()

测试SO_BROADCAST是否启用。

DatagramChannel getChannel()

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

InetAddress getInetAddress()

返回此套接字连接的地址。

InetAddress getLocalAddress()

获取套接字绑定到的本地地址。

int getLocalPort()

返回此套接字绑定到的本地主机上的端口号。

SocketAddress getLocalSocketAddress()

返回此套接字绑定到的端点的地址。

int getPort()

返回此套接字连接的端口号。

int getReceiveBufferSize()

获取此 DatagramSocket的SO_RCVBUF选项的值,即此平台在此 DatagramSocket上用于输入的缓冲区大小。

SocketAddress getRemoteSocketAddress()

返回此套接字连接的端点的地址,如果未连接,则 null

boolean getReuseAddress()

测试SO_REUSEADDR是否启用。

int getSendBufferSize()

获取此 DatagramSocket的SO_SNDBUF选项的值,即该平台在此 DatagramSocket上用于输出的缓冲区大小。

int getSoTimeout()

检索SO_TIMEOUT的设置。

int getTrafficClass()

获取此DatagramSocket发送的数据包的IP数据报头中的流量类或服务类型。

boolean isBound()

返回套接字的绑定状态。

boolean isClosed()

返回套接字是否关闭。

boolean isConnected()

返回套接字的连接状态。

void receive(DatagramPacket p)

从此套接字接收数据报数据包。

void send(DatagramPacket p)

从此套接字发送数据报数据包。

void setBroadcast(boolean on)

启用/禁用SO_BROADCAST。

static void setDatagramSocketImplFactory(DatagramSocketImplFactory fac)

为应用程序设置数据报套接字实现工厂。

void setReceiveBufferSize(int size)

将此SO_RCVBUF选项设置为此 DatagramSocket的指定值。

void setReuseAddress(boolean on)

启用/禁用SO_REUSEADDR套接字选项。

void setSendBufferSize(int size)

将此SO_SNDBUF选项设置为此 DatagramSocket的指定值。

void setSoTimeout(int timeout)

使用指定的超时启用/禁用SO_TIMEOUT,以毫秒为单位。

void setTrafficClass(int tc)

在此DatagramSocket发送的数据报的IP数据报头中设置流量类别或服务类型八位字节。

Inherited methods

From class java.lang.Object
From interface java.io.Closeable
From interface java.lang.AutoCloseable

Public constructors

DatagramSocket

Added in API level 1
DatagramSocket ()

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

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

Throws
SocketException if the socket could not be opened, or the socket could not bind to the specified local port.
SecurityException if a security manager exists and its checkListen method doesn't allow the operation.

也可以看看:

DatagramSocket

Added in API level 1
DatagramSocket (SocketAddress bindaddr)

创建绑定到指定本地套接字地址的数据报套接字。

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

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

Parameters
bindaddr SocketAddress: local socket address to bind, or null for an unbound socket.
Throws
SocketException if the socket could not be opened, or the socket could not bind to the specified local port.
SecurityException if a security manager exists and its checkListen method doesn't allow the operation.

也可以看看:

DatagramSocket

Added in API level 1
DatagramSocket (int port)

构造一个数据报套接字并将其绑定到本地主机上的指定端口。 该套接字将被绑定到wildcard地址,即由内核选择的IP地址。

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

Parameters
port int: port to use.
Throws
SocketException if the socket could not be opened, or the socket could not bind to the specified local port.
SecurityException if a security manager exists and its checkListen method doesn't allow the operation.

也可以看看:

DatagramSocket

Added in API level 1
DatagramSocket (int port, 
                InetAddress laddr)

创建绑定到指定本地地址的数据报套接字。 本地端口必须介于0和65535之间(含)。 如果IP地址为0.0.0.0,则套接字将绑定到wildcard地址,该地址是内核选择的IP地址。

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

Parameters
port int: local port to use
laddr InetAddress: local address to bind
Throws
SocketException if the socket could not be opened, or the socket could not bind to the specified local port.
SecurityException if a security manager exists and its checkListen method doesn't allow the operation.

也可以看看:

Protected constructors

DatagramSocket

Added in API level 1
DatagramSocket (DatagramSocketImpl impl)

用指定的DatagramSocketImpl创建一个未绑定的数据报套接字。

Parameters
impl DatagramSocketImpl: an instance of a DatagramSocketImpl the subclass wishes to use on the DatagramSocket.

Public methods

bind

Added in API level 1
void bind (SocketAddress addr)

将此DatagramSocket绑定到特定的地址和端口。

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

Parameters
addr SocketAddress: The address & port to bind to.
Throws
SocketException if any error happens during the bind, or if the socket is already bound.
SecurityException if a security manager exists and its checkListen method doesn't allow the operation.
IllegalArgumentException if addr is a SocketAddress subclass not supported by this socket.

close

Added in API level 1
void close ()

关闭此数据报套接字。

此套接字当前在 receive(DatagramPacket)被阻塞的任何线程将抛出 SocketException

如果此套接字具有关联的通道,那么该通道也会关闭。

connect

Added in API level 1
void connect (InetAddress address, 
                int port)

将套接字连接到此套接字的远程地址。 当套接字连接到远程地址时,只能将数据包发送到该地址或从该地址接收数据包。 默认情况下,数据报套接字未连接。

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

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

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

Parameters
address InetAddress: the remote address for the socket
port int: the remote port for the socket.
Throws
IllegalArgumentException if the address is null, or the port is out of range.
SecurityException if a security manager has been installed and it does not permit access to the given remote address

也可以看看:

connect

Added in API level 1
void connect (SocketAddress addr)

将此套接字连接到远程套接字地址(IP地址+端口号)。

如果给定 InetSocketAddress ,则此方法的行为与使用给定套接字地址IP地址和端口号调用 connect(InetAddress,int)一样。

Parameters
addr SocketAddress: The remote address.
Throws
SocketException if the connect fails
IllegalArgumentException if addr is null, or addr is a SocketAddress subclass not supported by this socket
SecurityException if a security manager has been installed and it does not permit access to the given remote address

disconnect

Added in API level 1
void disconnect ()

断开插座。 如果套接字已关闭或未连接,则此方法不起作用。

也可以看看:

getBroadcast

Added in API level 1
boolean getBroadcast ()

测试SO_BROADCAST是否启用。

Returns
boolean a boolean indicating whether or not SO_BROADCAST is enabled.
Throws
SocketException if there is an error in the underlying protocol, such as an UDP error.

也可以看看:

getChannel

Added in API level 1
DatagramChannel getChannel ()

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

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

Returns
DatagramChannel the datagram channel associated with this datagram socket, or null if this socket was not created for a channel

getInetAddress

Added in API level 1
InetAddress getInetAddress ()

返回此套接字连接的地址。 如果套接字未连接,则返回null

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

Returns
InetAddress the address to which this socket is connected.

getLocalAddress

Added in API level 1
InetAddress getLocalAddress ()

获取套接字绑定到的本地地址。

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

Returns
InetAddress 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

也可以看看:

getLocalPort

Added in API level 1
int getLocalPort ()

返回此套接字绑定到的本地主机上的端口号。

Returns
int 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.

getLocalSocketAddress

Added in API level 1
SocketAddress getLocalSocketAddress ()

返回此套接字绑定到的端点的地址。

Returns
SocketAddress a SocketAddress representing the local endpoint of this socket, or null if it is closed or not bound yet.

也可以看看:

getPort

Added in API level 1
int getPort ()

返回此套接字连接的端口号。 如果套接字未连接,则返回-1

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

Returns
int the port number to which this socket is connected.

getReceiveBufferSize

Added in API level 1
int getReceiveBufferSize ()

获取此 DatagramSocket的SO_RCVBUF选项的值,即此平台在此 DatagramSocket上用于输入的缓冲区大小。

Returns
int the value of the SO_RCVBUF option for this DatagramSocket
Throws
SocketException if there is an error in the underlying protocol, such as an UDP error.

也可以看看:

getRemoteSocketAddress

Added in API level 1
SocketAddress getRemoteSocketAddress ()

返回此套接字连接到的端点的地址,如果未连接,则 null

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

Returns
SocketAddress a SocketAddress representing the remote endpoint of this socket, or null if it is not connected yet.

也可以看看:

getReuseAddress

Added in API level 1
boolean getReuseAddress ()

测试SO_REUSEADDR是否启用。

Returns
boolean a boolean indicating whether or not SO_REUSEADDR is enabled.
Throws
SocketException if there is an error in the underlying protocol, such as an UDP error.

也可以看看:

getSendBufferSize

Added in API level 1
int getSendBufferSize ()

获取此 DatagramSocket的SO_SNDBUF选项的值,即该平台在此 DatagramSocket上用于输出的缓冲区大小。

Returns
int 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.

也可以看看:

getSoTimeout

Added in API level 1
int getSoTimeout ()

检索SO_TIMEOUT的设置。 0返回意味着该选项被禁用(即,无限超时)。

Returns
int the setting for SO_TIMEOUT
Throws
SocketException if there is an error in the underlying protocol, such as an UDP error.

也可以看看:

getTrafficClass

Added in API level 1
int getTrafficClass ()

获取此DatagramSocket发送的数据包的IP数据报头中的流量类或服务类型。

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

Returns
int the traffic class or type-of-service already set
Throws
SocketException if there is an error obtaining the traffic class or type-of-service value.

也可以看看:

isBound

Added in API level 1
boolean isBound ()

返回套接字的绑定状态。

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

Returns
boolean true if the socket successfully bound to an address

isClosed

Added in API level 1
boolean isClosed ()

返回套接字是否关闭。

Returns
boolean true if the socket has been closed

isConnected

Added in API level 1
boolean isConnected ()

返回套接字的连接状态。

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

Returns
boolean true if the socket successfully connected to a server

receive

Added in API level 1
void receive (DatagramPacket p)

从此套接字接收数据报数据包。 当此方法返回时, DatagramPacket的缓冲区将充满收到的数据。 数据报包还包含发件人的IP地址和发件人计算机上的端口号。

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

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

Parameters
p DatagramPacket: 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.

也可以看看:

send

Added in API level 1
void send (DatagramPacket p)

从此套接字发送数据报数据包。 DatagramPacket包含指示要发送的数据的信息,其长度,远程主机的IP地址以及远程主机上的端口号。

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

Parameters
p DatagramPacket: 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.

也可以看看:

setBroadcast

Added in API level 1
void setBroadcast (boolean on)

启用/禁用SO_BROADCAST。

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

Parameters
on boolean: whether or not to have broadcast turned on.
Throws
SocketException if there is an error in the underlying protocol, such as an UDP error.

也可以看看:

setDatagramSocketImplFactory

Added in API level 1
void setDatagramSocketImplFactory (DatagramSocketImplFactory fac)

为应用程序设置数据报套接字实现工厂。 工厂只能指定一次。

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

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

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

Parameters
fac DatagramSocketImplFactory: the desired factory.
Throws
IOException if an I/O error occurs when setting the datagram socket factory.
SocketException if the factory is already defined.
SecurityException if a security manager exists and its checkSetFactory method doesn't allow the operation.

也可以看看:

setReceiveBufferSize

Added in API level 1
void setReceiveBufferSize (int size)

将这个10_1588815939959的SO_RCVBUF选项设置为指定的值。 网络实现使用SO_RCVBUF选项作为调整底层网络I / O缓冲区大小的提示。 网络实现也可以使用SO_RCVBUF设置来确定可以在此套接字上接收的数据包的最大大小。

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

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

注意:如果可以接收大于SO_RCVBUF的数据包,则具体实现。

Parameters
size int: the size to which to set the receive buffer size. 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.

也可以看看:

setReuseAddress

Added in API level 1
void setReuseAddress (boolean on)

启用/禁用SO_REUSEADDR套接字选项。

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

注意:所有现有平台都不支持此功能,因此该选项是否会被忽略是具体实现。 但是,如果不支持,则getReuseAddress()将始终返回false

当创建 DatagramSocket时 ,初始设置 SO_REUSEADDR被禁用。

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

Parameters
on boolean: whether to enable or disable the
Throws
SocketException if an error occurs enabling or disabling the SO_RESUEADDR socket option, or the socket is closed.

也可以看看:

setSendBufferSize

Added in API level 1
void setSendBufferSize (int size)

将SO_SNDBUF选项设置为此DatagramSocket的指定值。 网络实现使用SO_SNDBUF选项作为调整底层网络I / O缓冲区大小的提示。 网络实现也可以使用SO_SNDBUF设置来确定可以在此套接字上发送的数据包的最大大小。

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

当发送速率较高时,增加缓冲区大小可以允许网络实现对多个输出数据包进行排队。

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

Parameters
size int: the size to which to set the send buffer size. 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.

也可以看看:

setSoTimeout

Added in API level 1
void setSoTimeout (int timeout)

使用指定的超时启用/禁用SO_TIMEOUT,以毫秒为单位。 通过将此选项设置为非零超时,对此DatagramSocket的receive()调用将仅阻塞这段时间。 如果超时过期,则会引发java.net.SocketTimeoutException ,尽管DatagramSocket仍然有效。 该选项必须在进入阻止操作生效之前启用。 超时值必须大于0.超时值为零将被解释为无限超时。

Parameters
timeout int: the specified timeout in milliseconds.
Throws
SocketException if there is an error in the underlying protocol, such as an UDP error.

也可以看看:

setTrafficClass

Added in API level 1
void setTrafficClass (int tc)

在此DatagramSocket发送的数据报的IP数据报头中设置流量类别或服务类型八位字节。 由于底层网络实施可能会忽略此值,因此应用程序应将其视为暗示。

该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)
The last low order bit is always ignored as this corresponds to the MBZ (must be zero) bit.

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

对于Internet协议版本6 tc是将放置在IP标头的sin6_flowinfo字段中的值。

Parameters
tc int: an int value for the bitset.
Throws
SocketException if there is an error setting the traffic class or type-of-service

也可以看看:

Hooray!