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上接收广播。
也可以看看:
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() 返回与此数据报套接字关联的唯一 |
InetAddress |
getInetAddress() 返回此套接字连接的地址。 |
InetAddress |
getLocalAddress() 获取套接字绑定到的本地地址。 |
int |
getLocalPort() 返回此套接字绑定到的本地主机上的端口号。 |
SocketAddress |
getLocalSocketAddress() 返回此套接字绑定到的端点的地址。 |
int |
getPort() 返回此套接字连接的端口号。 |
int |
getReceiveBufferSize() 获取此 DatagramSocket的SO_RCVBUF选项的值,即此平台在此 DatagramSocket上用于输入的缓冲区大小。 |
SocketAddress |
getRemoteSocketAddress() 返回此套接字连接的端点的地址,如果未连接,则 |
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
|
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 (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 (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 (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. |
也可以看看:
DatagramSocket (DatagramSocketImpl impl)
用指定的DatagramSocketImpl创建一个未绑定的数据报套接字。
Parameters | |
---|---|
impl |
DatagramSocketImpl : an instance of a DatagramSocketImpl the subclass wishes to use on the DatagramSocket. |
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. |
void close ()
关闭此数据报套接字。
此套接字当前在 receive(DatagramPacket)
被阻塞的任何线程将抛出 SocketException
。
如果此套接字具有关联的通道,那么该通道也会关闭。
void connect (InetAddress address, int port)
将套接字连接到此套接字的远程地址。 当套接字连接到远程地址时,只能将数据包发送到该地址或从该地址接收数据包。 默认情况下,数据报套接字未连接。
如果套接字所连接的远程目标不存在或者无法访问,并且如果该地址收到ICMP目标不可达数据包,则后续对发送或接收的调用可能会引发PortUnreachableException。 请注意,不能保证会抛出异常。
如果安装了安全管理器,则会调用它来检查对远程地址的访问。 具体而言,如果给定address
是multicast address
,安全管理的checkMulticast
方法被调用给定address
。 否则,调用安全管理器的checkConnect
和checkAccept
方法,并使用给定的address
和port
来验证是否允许分别发送和接收数据报。
当连接套接字时,除了匹配数据包和套接字的地址和端口之外, receive
和send
不会对传入和传出数据包执行任何安全检查 。 在发送操作中,如果数据包的地址已设置,并且数据包的地址和套接字的地址不匹配,则会引发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 |
也可以看看:
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 |
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. |
也可以看看:
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 |
InetAddress getInetAddress ()
返回此套接字连接的地址。 如果套接字未连接,则返回null
。
如果套接字在 closed
之前已连接,则在套接字关闭后,此方法将继续返回连接的地址。
Returns | |
---|---|
InetAddress |
the address to which this socket is connected. |
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 |
也可以看看:
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. |
SocketAddress getLocalSocketAddress ()
返回此套接字绑定到的端点的地址。
Returns | |
---|---|
SocketAddress |
a SocketAddress representing the local endpoint of this socket, or null if it is closed or not bound yet. |
int getPort ()
返回此套接字连接的端口号。 如果套接字未连接,则返回-1
。
如果套接字在 closed
之前已连接,则在套接字关闭后,此方法将继续返回连接的端口号。
Returns | |
---|---|
int |
the port number to which this socket is connected. |
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. |
也可以看看:
SocketAddress getRemoteSocketAddress ()
返回此套接字连接到的端点的地址,如果未连接,则 null
。
如果套接字在 closed
之前已连接,则在套接字关闭后,此方法将继续返回连接的地址。
Returns | |
---|---|
SocketAddress |
a SocketAddress representing the remote endpoint of this socket, or null if it is not connected yet. |
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. |
也可以看看:
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. |
也可以看看:
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. |
也可以看看:
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. |
也可以看看:
boolean isBound ()
返回套接字的绑定状态。
如果套接字在 closed
之前被 closed
,那么在套接字关闭后,此方法将继续返回 true
。
Returns | |
---|---|
boolean |
true if the socket successfully bound to an address |
boolean isClosed ()
返回套接字是否关闭。
Returns | |
---|---|
boolean |
true if the socket has been closed |
boolean isConnected ()
返回套接字的连接状态。
如果套接字在 closed
之前已连接,则在套接字关闭后此方法将继续返回 true
。
Returns | |
---|---|
boolean |
true if the socket successfully connected to a server |
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. |
也可以看看:
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. |
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. |
也可以看看:
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. |
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. |
也可以看看:
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. |
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. |
也可以看看:
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. |
也可以看看:
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)
在优先级字段中设置位可能会导致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 |
也可以看看: