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接收广播。
DatagramPacket
,
DatagramChannel
Modifier | Constructor and Description |
---|---|
|
DatagramSocket()
构建一个数据报套接字绑定到本地主机的任何可用的端口。
|
protected |
DatagramSocket(DatagramSocketImpl impl)
创建一个绑定的数据报套接字与指定的datagramsocketimpl。
|
|
DatagramSocket(int port)
构建一个数据报套接字绑定到本地主机的指定端口。
|
|
DatagramSocket(int port, InetAddress laddr)
创建一个数据报套接字,绑定到指定的本地地址。
|
|
DatagramSocket(SocketAddress bindaddr)
创建一个数据报套接字,绑定到指定的本地套接字地址。
|
Modifier and Type | Method and Description |
---|---|
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()
获取交通类或类型的服务在IP数据报头的DatagramSocket发送的数据包。
|
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数据报头字节型服务。
|
public DatagramSocket() throws SocketException
wildcard
地址,IP地址由内核选择。
如果存在安全管理器,它的checkListen
方法是先叫0来保证操作的参数是允许的。这可能导致SecurityException。
SocketException
如果插座无法打开,或插座不能绑定到指定的本地端口。
SecurityException
-如果存在一个安全管理及其
checkListen
方法不允许操作。
SecurityManager.checkListen(int)
protected DatagramSocket(DatagramSocketImpl impl)
impl
-一个
datagramsocketimpl类希望使用DatagramSocket实例。
public DatagramSocket(SocketAddress bindaddr) throws SocketException
如果,如果地址是null
,创建一个绑定套接字。
如果存在安全管理器,它的checkListen
方法从套接字地址的端口以确保操作的参数是允许先叫。这可能导致SecurityException。
bindaddr
本地套接字地址的绑定,或
null
为未绑定套接字。
SocketException
如果插座无法打开,或插座不能绑定到指定的本地端口。
SecurityException
-如果存在一个安全管理及其
checkListen
方法不允许操作。
SecurityManager.checkListen(int)
public DatagramSocket(int port) throws SocketException
wildcard
地址,IP地址由内核选择。
如果存在安全管理器,它的checkListen
方法是确保操作的参数是允许的port
争论先叫。这可能导致SecurityException。
port
端口使用。
SocketException
如果插座无法打开,或插座不能绑定到指定的本地端口。
SecurityException
-如果存在一个安全管理及其
checkListen
方法不允许操作。
SecurityManager.checkListen(int)
public DatagramSocket(int port, InetAddress laddr) throws SocketException
wildcard
地址,IP地址由内核选择。
如果存在安全管理器,它的checkListen
方法是确保操作的参数是允许的port
争论先叫。这可能导致SecurityException。
port
本地端口使用
laddr
-本地地址绑定
SocketException
如果插座无法打开,或插座不能绑定到指定的本地端口。
SecurityException
-如果存在一个安全管理及其
checkListen
方法不允许操作。
SecurityManager.checkListen(int)
public void bind(SocketAddress addr) throws SocketException
如果地址是null
,然后系统会拿起一个临时端口和一个有效的本地地址绑定套接字。
addr
-绑定的地址和端口。
SocketException
-如果任何错误发生在绑定,或者如果插座已绑定。
SecurityException
-如果存在一个安全管理及其
checkListen
方法不允许操作。
IllegalArgumentException
如果地址是由该套接字不支持SocketAddress类。
public void connect(InetAddress address, int port)
如果远程目的地插座连接不存在,或者是遥不可及的,如果一个ICMP目的不可达报文已收到,地址,随后电话发送或接收可能会抛出一个portunreachableexception。注意,没有保证将被抛出的异常。
如果一个安全管理器已被安装,那么它将被调用以检查访问远程地址。具体地说,如果给定的address
是multicast address
,保安部经理的checkMulticast
方法与给定的address
调用。否则,保安部经理的checkConnect
和checkAccept
方法被调用时,在给定的address
和port
,验证数据包可以发送和接收分别。
当一个套接字连接,receive
和send
不会执行任何安全检查传入和传出的数据包,除了匹配的包和套接字的地址和端口。在发送操作,如果数据包的地址设置和数据包的地址和套接字的地址不匹配,将抛出一个IllegalArgumentException
。一个连接到一个多播地址的套接字只能用于发送数据包。
address
-远程套接字地址
port
-远程套接字端口。
IllegalArgumentException
-如果地址无效,或端口范围外。
SecurityException
如果安全管理器已经安装,它不允许访问特定的远程地址
disconnect()
public void connect(SocketAddress addr) throws SocketException
如果给定一个InetSocketAddress
,此方法的行为如果调用connect(InetAddress,int)
与给定的套接字地址的IP地址和端口号。
addr
-远程地址。
SocketException
如果连接失败
IllegalArgumentException
-如果
addr
是
null
,或
addr
是这个插座不支持SocketAddress类
SecurityException
如果安全管理器已经安装,它不允许访问特定的远程地址
public void disconnect()
public boolean isBound()
如果插座会被closed
之前,本方法将继续在套接字关闭返回true
。
public boolean isConnected()
如果插座连接到closed
之前,本方法将继续在套接字关闭返回true
。
public InetAddress getInetAddress()
null
如果套接字没有连接。
如果插座连接到closed
之前,那么这个方法之后会继续关闭套接字连接返回的地址。
public int getPort()
-1
如果套接字没有连接。
如果插座连接到closed
之前,那么这个方法之后会继续关闭套接字连接的端口号返回。
public SocketAddress getRemoteSocketAddress()
null
。
如果插座连接到closed
之前,那么这个方法之后会继续关闭套接字连接返回的地址。
SocketAddress
表示此套接字的远程端点,或
null
如果尚未连接。
getInetAddress()
,
getPort()
,
connect(SocketAddress)
public SocketAddress getLocalSocketAddress()
SocketAddress
表示此套接字的本地端点,或
null
如果是封闭的或不受约束的呢。
getLocalAddress()
,
getLocalPort()
,
bind(SocketAddress)
public void send(DatagramPacket p) throws IOException
DatagramPacket
包括信息显示要发送的数据长度,远程主机的IP地址和端口号,远程主机。
如果有一个安全管理器,并且套接字目前没有连接到远程地址,该方法首先执行一些安全检查。首先,如果p.getAddress().isMulticastAddress()
是真实的,这种方法称p.getAddress()
安全经理的checkMulticast
方法作为参数。如果这个表达是错误的评价,这种方法而不是调用参数p.getAddress().getHostAddress()
和p.getPort()
安全经理的checkConnect
方法。每次调用一个安全管理方法如果操作不允许导致SecurityException。
p
-
DatagramPacket
被发送。
IOException
如果I/O错误发生。
SecurityException
-如果存在一个安全管理及其
checkMulticast
或
checkConnect
方法不允许发送。
PortUnreachableException
可能如果插座连接到目前遥不可及的目标投掷。注意,没有保证将被抛出的异常。
IllegalBlockingModeException
-如果这插座有对应的通道和通道处于非阻塞模式。
IllegalArgumentException
如果插座连接,连接的地址和数据包的地址不同。
DatagramPacket
,
SecurityManager.checkMulticast(InetAddress)
,
SecurityManager.checkConnect(java.lang.String, int)
public void receive(DatagramPacket p) throws IOException
DatagramPacket
缓冲区满是收到的数据。数据包也包含发送者的IP地址和端口号发送的机器。
这种方法阻塞直到数据接收。该数据报包对象的length
字段包含接收消息的长度。如果消息比数据包的长度长,则消息被截断。
如果存在安全管理器,数据包不能接受如果安全经理的checkAccept
方法不允许它。
p
-
DatagramPacket
的输入数据的地方。
IOException
如果I/O错误发生。
SocketTimeoutException
-如果setsotimeout以前称,超时过期了。
PortUnreachableException
可能如果插座连接到目前遥不可及的目标投掷。注意,没有保证将被抛出的异常。
IllegalBlockingModeException
-如果这插座有对应的通道和通道处于非阻塞模式。
DatagramPacket
,
DatagramSocket
public InetAddress getLocalAddress()
如果存在安全管理器,它的checkConnect
方法与主机地址和-1
作为它的参数来看看操作允许先叫。
null
如果套接字关闭,或
InetAddress
代表
wildcard
地址如果插座是不受约束的,或安全经理
checkConnect
方法不允许操作
SecurityManager.checkConnect(java.lang.String, int)
public int getLocalPort()
-1
如果套接字关闭,或
0
如果未绑定。
public void setSoTimeout(int timeout) throws SocketException
> 0
。超时零解释为无限超时。
timeout
-以毫秒为单位指定的超时。
SocketException
-如果在底层协议有错误,如UDP错误。
getSoTimeout()
public int getSoTimeout() throws SocketException
SocketException
-如果在底层协议有错误,如UDP错误。
setSoTimeout(int)
public void setSendBufferSize(int size) throws SocketException
DatagramSocket
指定值。的so_sndbuf选项用于通过网络实施,作为一个提示大小基本网络I/O缓冲器。的so_sndbuf设置也可以通过网络实现,用来确定数据包可以发送这个插座的最大大小。
作为so_sndbuf是一个暗示,想验证缓冲是什么尺寸的程序应该调用getSendBufferSize()
。
增加缓冲区的大小可以允许多个传出的数据包被排队的网络实现时,发送速率高。
注意:如果send(DatagramPacket)
用来发送DatagramPacket
是大于设定so_sndbuf如果分组发送或丢弃它的具体实施。
size
的大小来设置发送缓冲区的大小。此值必须大于0。
SocketException
-如果在底层协议有错误,如UDP错误。
IllegalArgumentException
-如果该值为0或为负。
getSendBufferSize()
public int getSendBufferSize() throws SocketException
DatagramSocket
的so_sndbuf期权价值,即缓冲区的大小由平台用于输出在这
DatagramSocket
。
DatagramSocket
的so_sndbuf期权的价值
SocketException
-如果在底层协议有错误,如UDP错误。
setSendBufferSize(int)
public void setReceiveBufferSize(int size) throws SocketException
DatagramSocket
指定值,so_rcvbuf选项是用网络的实现作为一个暗示的大小基本网络I/O缓冲器。的so_rcvbuf设置也可以通过网络实现,用来确定数据包可以在这座收到的最大大小。
因为so_rcvbuf是一个暗示,那要验证的缓冲设置什么尺寸的程序应该调用getReceiveBufferSize()
。
增加so_rcvbuf可以允许网络实现缓冲区的多个数据包数据包到达时的速度比接受使用receive(DatagramPacket)
。
注:这是实现特定的分组是否大于so_rcvbuf可以收到。
size
的大小来设置接收缓冲区的大小。此值必须大于0。
SocketException
-如果在底层协议有错误,如UDP错误。
IllegalArgumentException
-如果该值为0或为负。
getReceiveBufferSize()
public int getReceiveBufferSize() throws SocketException
DatagramSocket
的so_rcvbuf期权价值,即通过平台用于该
DatagramSocket
输入缓冲区的大小。
DatagramSocket
的so_rcvbuf期权的价值
SocketException
-如果在底层协议有错误,如UDP错误。
setReceiveBufferSize(int)
public void setReuseAddress(boolean on) throws SocketException
UDP套接字可能需要绑定多个socket套接字地址相同。这通常是用于接收组播数据包的目的(见MulticastSocket
)。的SO_REUSEADDR
套接字选项允许多个插座,如果能够结合使用bind(SocketAddress)
插座之前是SO_REUSEADDR
套接字选项绑定到一个套接字地址。
请注意:此功能不支持所有现有的平台,所以它是实现具体的,是否这个选项将被忽略或不。但是,如果它不支持然后getReuseAddress()
将总是返回false
。
当一个DatagramSocket
建立SO_REUSEADDR
初始设置是禁用的。
行为时,SO_REUSEADDR
启用或禁用后一个套接字绑定(见isBound()
)没有定义。
on
-是否启用或禁用
SocketException
-如果出现错误启用或禁用的
SO_RESUEADDR
套接字选项,或关闭套接字。
getReuseAddress()
,
bind(SocketAddress)
,
isBound()
,
isClosed()
public boolean getReuseAddress() throws SocketException
boolean
指示是否启用so_reuseaddr。
SocketException
-如果在底层协议有错误,如UDP错误。
setReuseAddress(boolean)
public void setBroadcast(boolean on) throws SocketException
有些操作系统可能需要的java虚拟机启动实施的具体权限启用此选项或发送广播数据报。
on
是否有广播打开。
SocketException
-如果在底层协议有错误,如UDP错误。
getBroadcast()
public boolean getBroadcast() throws SocketException
boolean
指示是否启用so_broadcast。
SocketException
-如果在底层协议有错误,如UDP错误。
setBroadcast(boolean)
public void setTrafficClass(int tc) throws SocketException
TC 必须范围是0 <= tc <= 255
或时会抛出。
笔记:
互联网协议的V4的价值由integer
,其中最重要的8位代表套接字发送的IP数据包的TOS字节的值。RFC 1349定义的TOS值如下:
IPTOS_LOWCOST (0x02)
IPTOS_RELIABILITY (0x04)
IPTOS_THROUGHPUT (0x08)
IPTOS_LOWDELAY (0x10)
在优先领域设定位可能导致线程说明操作是不允许的。
互联网协议V6 tc
是价值,将被放置到IP报头的sin6_flowinfo场。
tc
- bitset的
int
价值。
SocketException
-如果有一个错误的交通类或服务类型设置
getTrafficClass()
public int getTrafficClass() throws SocketException
作为底层网络实现可以忽略交通类或服务类型设置使用setTrafficClass(int)
这种方法可能返回比以前使用的方法在这setTrafficClass(int)
DatagramSocket不同价值。
SocketException
-如果有错误获得交通类或服务类型值。
setTrafficClass(int)
public void close()
任何线程目前受阻于receive(java.net.DatagramPacket)
在这座将SocketException
。
如果这个套接字有一个相关的通道,那么这个通道也关闭了。
close
接口
Closeable
close
接口
AutoCloseable
public boolean isClosed()
public DatagramChannel getChannel()
DatagramChannel
对象,如果任何。
数据报套接字将有一个通道,如果,如果,渠道本身是通过创建DatagramChannel.open
方法。
null
如果这个插座不是一个通道
public static void setDatagramSocketImplFactory(DatagramSocketImplFactory fac) throws IOException
当一个应用程序创建一个新的数据报套接字,该套接字实现工厂的createDatagramSocketImpl
方法来创建实际的数据报套接字实现。
通过null
的方法是一种无OP除非厂家已经设置。
如果存在安全管理器,该方法首先调用安全管理器的checkSetFactory
方法确保操作是允许的。这可能导致SecurityException。
fac
-所需的工厂。
IOException
-如果一个I / O错误设置数据报套接字工厂时。
SocketException
-如果工厂已经定义。
SecurityException
-如果存在一个安全管理及其
checkSetFactory
方法不允许操作。
DatagramSocketImplFactory.createDatagramSocketImpl()
,
SecurityManager.checkSetFactory()
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.