DatagramSocket API 详解

7 篇文章 0 订阅
此类表示用来发送和接收数据报包的套接字。

数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。

在 DatagramSocket 上总是启用 UDP 广播发送。为了接收广播包,应该将 DatagramSocket 绑定到通配符地址。在某些实现中,将 DatagramSocket 绑定到一个更加具体的地址时广播包也可以被接收。

示例:DatagramSocket s = new DatagramSocket(null); s.bind(new InetSocketAddress(8888)); 这等价于:DatagramSocket s = new DatagramSocket(8888); 两个例子都能创建能够在 UDP 8888 端口上接收广播的 DatagramSocket。

version1.101, 06/08/06
sinceJDK1.0
See alsojava.net.DatagramPacketjava.nio.channels.DatagramChannel


Constructors
publicDatagramSocket() throws SocketException
zh_cn
构造数据报套接字并将其绑定到本地主机上任何可用的端口。套接字将被绑定到通配符地址,IP 地址由内核来选择。

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

ThrowsSocketException
zh_cn
如果套接字不能被打开,或不能将其绑定到指定的本地端口。
ThrowsSecurityException
zh_cn
如果安全管理器存在并且其 checkListen 方法不允许进行该操作。
See alsocheckListen

protectedDatagramSocket(DatagramSocketImpl impl)
zh_cn
创建带有指定 DatagramSocketImpl 的未绑定数据报套接字。
impl
zh_cn
子类希望在 DatagramSocket 上使用的 DatagramSocketImpl 的实例。
since1.4
publicDatagramSocket(SocketAddress bindaddr) throws SocketException
zh_cn
创建数据报套接字,将其绑定到指定的本地套接字地址。

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

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

bindaddr
zh_cn
要绑定的本地套接字地址,对于未绑定的套接字为 null
ThrowsSocketException
zh_cn
如果套接字不能被打开,或不能将其绑定到指定的本地端口。
ThrowsSecurityException
zh_cn
如果安全管理器存在并且其 checkListen 方法不允许进行该操作。
since1.4
See alsocheckListen

publicDatagramSocket(int port) throws SocketException
zh_cn
创建数据报套接字并将其绑定到本地主机上的指定端口。套接字将被绑定到通配符地址,IP 地址由内核来选择。

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

port
zh_cn
要使用的端口。
ThrowsSocketException
zh_cn
如果套接字不能被打开,或不能将其绑定到指定的本地端口。
ThrowsSecurityException
zh_cn
如果安全管理器存在并且其 checkListen 方法不允许进行该操作。
See alsocheckListen

publicDatagramSocket(int port, InetAddress laddr) throws SocketException
zh_cn
创建数据报套接字,将其绑定到指定的本地地址。本地端口必须在 0 到 65535 之间(包括两者)。如果 IP 地址为 0.0.0.0,套接字将被绑定到通配符地址,IP 地址由内核选择。

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

port
zh_cn
要使用的本地端口
laddr
zh_cn
要绑定的本地地址
ThrowsSocketException
zh_cn
如果套接字不能被打开,或不能将其绑定到指定的本地端口。
ThrowsSecurityException
zh_cn
如果安全管理器存在并且其 checkListen 方法不允许进行该操作。
sinceJDK1.1
See alsocheckListen


Methods
public voidbind(SocketAddress addr) throws SocketException
zh_cn
将此 DatagramSocket 绑定到特定的地址和端口。

如果地址为 null,则系统将挑选一个临时端口和一个有效本地地址来绑定套接字。

addr
zh_cn
要绑定的地址和端口。
ThrowsSocketException
zh_cn
如果绑定过程中发生错误,或者套接字已经被绑定。
ThrowsSecurityException
zh_cn
如果安全管理器存在并且其 checkListen 方法不允许进行该操作。
ThrowsIllegalArgumentException
zh_cn
如果 addr 是不受此套接字支持的 SocketAddress 子类。
since1.4

public voidclose()
zh_cn
关闭此数据报套接字。

在此套接字上 #receive 中所有当前阻塞的线程将会抛出 SocketException

如果此套接字有一个与之关联的通道,则关闭该通道。

revised1.4
specJSR-51

public voidconnect(InetAddress address, int port)
zh_cn
将套接字连接到此套接字的远程地址。当套接字连接到远程地址时,包就只能从该地址发送或接收。默认情况下不连接数据报套接字。

如果套接字要连接的远程目标不存在或不可到达,并且收到了该地址的目标不可达 ICMP 包,那么后续发送和接收的调用可能会抛出 PortUnreachableException。注意,不能保证一定抛出该异常。

在连接时检查调用者对给定主机和端口的发送和接收数据报权限。当连接建立起来后,接收和发送除了对包和套接字的地址和端口进行匹配外,对传入和传出的包将不再执行任何安全性检查。对于发送操作,如果设置了包的地址并且包的地址和套接字的地址不匹配,则将抛出 IllegalArgumentException。连接到多播地址的套接字只能用于发送包。

address
zh_cn
套接字的远程地址。
port
zh_cn
套接字的远程端口。
ThrowsIllegalArgumentException
zh_cn
如果地址为 null,或端口超出了范围。
ThrowsSecurityException
zh_cn
如果不允许调用者向此地址和端口发送也不允许从此地址接收数据报。
See alsodisconnectsendreceive

public voidconnect(SocketAddress addr) throws SocketException
zh_cn
将此套接字连接到远程套接字地址(IP 地址 + 端口号)。

addr
zh_cn
远程地址。
ThrowsSocketException
zh_cn
如果连接失败
ThrowsIllegalArgumentException
zh_cn
如果 addr 为 null 或者 addr 是不受此套接字支持的 SocketAddress 子类。
since1.4
See alsoconnect

public voiddisconnect()
zh_cn
断开套接字的连接。如果套接字没有连接,则此方法不执行任何操作。
See alsoconnect
public voidreceive(DatagramPacket p) throws IOException
zh_cn
从此套接字接收数据报包。当此方法返回时,DatagramPacket 的缓冲区填充了接收的数据。数据报包也包含发送方的 IP 地址和发送方机器上的端口号。

此方法在接收到数据报前一直阻塞。数据报包对象的 length 字段包含所接收信息的长度。如果信息比包的长度长,该信息将被截短。

如果存在安全管理器,而安全管理器的 checkAccept 方法不允许接收操作,则包不能被接收。

p
zh_cn
要放置传入数据的 DatagramPacket
ThrowsIOException
zh_cn
如果发生 I/O 错误。
ThrowsSocketTimeoutException
zh_cn
如果先前调用了 setSoTimeout 且超时值已过。
ThrowsPortUnreachableException
zh_cn
套接字连接到当前不可达的目标时可能抛出。注意,不能保证一定抛出该异常。
Throwsjava.nio.channels.IllegalBlockingModeException: 
zh_cn
如果此套接字具有相关联的通道,且通道处于非阻塞模式。
revised1.4
specJSR-51
See alsojava.net.DatagramPacketjava.net.DatagramSocket

public voidsend(DatagramPacket p) throws IOException
zh_cn
从此套接字发送数据报包。DatagramPacket 包含的信息指示:将要发送的数据、其长度、远程主机的 IP 地址和远程主机的端口号。

如果存在安全管理器,且套接字当前没有连接到远程地址,则此方法首先执行某些安全性检查。首先,如果p.getAddress().isMulticastAddress() 为 true,则此方法以 p.getAddress() 作为参数调用安全管理器的 checkMulticast 方法。如果该表达式的值为 false,此方法改为调用安全管理器的以 p.getAddress().getHostAddress() 和 p.getPort() 为参数的 checkConnect 方法。如果不允许该操作,则每次调用安全管理器方法都会导致 SecurityException。

p
zh_cn
将要发送的 DatagramPacket
ThrowsIOException
zh_cn
如果发生 I/O 错误。
ThrowsSecurityException
zh_cn
如果安全管理器存在并且其 checkMulticast 或 checkConnect 方法不允许发送。
ThrowsPortUnreachableException
zh_cn
套接字连接到当前不可达的目标时可能抛出。注意,不能保证一定抛出该异常。
Throwsjava.nio.channels.IllegalBlockingModeException: 
zh_cn
如果此套接字具有相关联的通道,且通道处于非阻塞模式。
revised1.4
specJSR-51
See alsojava.net.DatagramPacketcheckMulticast(InetAddress)checkConnect


Properties
public booleanisBound()
zh_cn
返回套接字的绑定状态。
return
zh_cn
如果将套接字成功地绑定到一个地址,则返回 true
since1.4
public voidsetBroadcast(boolean on) throws SocketException
zh_cn
启用/禁用 SO_BROADCAST。
on
zh_cn
是否开启广播。
ThrowsSocketException
zh_cn
如果底层协议出现错误,例如 UDP 错误。
since1.4
See alsogetBroadcast()
public booleangetBroadcast() throws SocketException
zh_cn
检测是否启用了 SO_BROADCAST。
return
zh_cn
指示是否启用 SO_BROADCAST 的 boolean 值。
ThrowsSocketException
zh_cn
如果底层协议出现错误,例如 UDP 错误。
since1.4
See alsosetBroadcast(boolean)
public DatagramChannelgetChannel()
zh_cn
返回与此数据报套接字关联的唯一 java.nio.channels.DatagramChannel 对象(如果有)。

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

return
zh_cn
与此数据报套接字关联的数据报通道,如果没有为通道创建套接字,则返回 null
since1.4
specJSR-51

public booleanisClosed()
zh_cn
返回是否关闭了套接字。
return
zh_cn
如果已经关闭了套接字,则返回 true
since1.4
public booleanisConnected()
zh_cn
返回套接字的连接状态。
return
zh_cn
如果将套接字成功地连接到服务器,则为 true。
since1.4
public static voidsetDatagramSocketImplFactory(DatagramSocketImplFactory fac) throws IOException
zh_cn
为应用程序设置数据报套接字实现工厂。工厂只能指定一次。

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

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

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

fac
zh_cn
所需的工厂。
ThrowsIOException
zh_cn
如果设置数据报套接字工厂时发生 I/O 错误。
ThrowsSocketException
zh_cn
如果已经定义该工厂。
ThrowsSecurityException
zh_cn
如果安全管理器存在并且其 checkSetFactory 方法不允许进行该操作。
since1.3
See alsocreateDatagramSocketImpl()checkSetFactory

public InetAddressgetInetAddress()
zh_cn
返回此套接字连接的地址。如果套接字未连接,则返回 null。
return
zh_cn
此套接字连接的地址。
public InetAddressgetLocalAddress()
zh_cn
获取套接字绑定的本地地址。

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

return
zh_cn
套接字绑定的本地地址,如果套接字没有绑定或安全管理器的 checkConnect 方法不允许该操作,则返回表示任何本地地址的 InetAddress
since1.1
See alsocheckConnect

public intgetLocalPort()
zh_cn
返回此套接字绑定的本地主机上的端口号。
return
zh_cn
此套接字绑定的本地主机上的端口。
public SocketAddressgetLocalSocketAddress()
zh_cn
返回此套接字绑定的端点的地址,如果尚未绑定则返回 null
return
zh_cn
表示此套接字的本地端点的 SocketAddress,如果尚未绑定则返回 null
since1.4
See alsogetLocalAddress()getLocalPort()bind(SocketAddress)
public intgetPort()
zh_cn
返回此套接字的端口。如果套接字未连接,则返回 -1。
return
zh_cn
此套接字连接的端口。
public voidsetReceiveBufferSize(int size) throws SocketException
zh_cn
将此 DatagramSocket 的 SO_RCVBUF 选项设置为指定的值。网络实现使用 SO_RCVBUF 选项作为设置底层网络 I/O 缓冲区大小的提示。网络实现也可以使用 SO_RCVBUF 设置来决定在此套接字上可以接收的包的最大大小。

由于 SO_RCVBUF 是一种提示,想要验证缓冲区设置大小的应用程序应该调用 #getReceiveBufferSize()

当包到达的速度快于使用 #receive(DatagramPacket) 接收包的速度时,增大 SO_RCVBUF 可以允许网络实现缓存多个包。

注:是否能接收大于 SO_RCVBUF 的包是特定于实现的。

size
zh_cn
要设置的接收缓冲区大小。此值必须大于 0。
ThrowsSocketException
zh_cn
如果底层协议出现错误,例如 UDP 错误。
ThrowsIllegalArgumentException
zh_cn
如果值为 0 或负。
See alsogetReceiveBufferSize()

public intgetReceiveBufferSize() throws SocketException
zh_cn
获取此 DatagramSocket 的 SO_RCVBUF 选项的值,该值是平台在 DatagramSocket 上输入时使用的缓冲区大小。
return
zh_cn
此 DatagramSocket 的 SO_RCVBUF 选项的值。
ThrowsSocketException
zh_cn
如果底层协议出现错误,例如 UDP 错误。
See alsosetReceiveBufferSize(int)
public SocketAddressgetRemoteSocketAddress()
zh_cn
返回此套接字连接的端点的地址,如果未连接则返回 null
return
zh_cn
表示此套接字远程端点的 SocketAddress,如果尚未连接则返回 null
since1.4
See alsogetInetAddress()getPort()connect(SocketAddress)
public voidsetReuseAddress(boolean on) throws SocketException
zh_cn
启用/禁用 SO_REUSEADDR 套接字选项。

对于 UDP 套接字可能有必要把超过一个的套接字绑定到相同的套接字地址。这样做的目的通常是为了接收多播包。(请参阅java.net.MulticastSocket)。如果在使用 #bind(SocketAddress) 绑定套接字之前启用 SO_REUSEADDR 套接字选项,则 SO_REUSEADDR 套接字选项允许将多个套接字绑定到相同的套结字地址。

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

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

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

on
zh_cn
是否启用 SO_REUSEADDR 套接字选项
ThrowsSocketException
zh_cn
SO_RESUEADDR 套接字选项时发生错误,或者关闭了套接字。
since1.4
See alsogetReuseAddress()bind(SocketAddress)isBound()isClosed()

public booleangetReuseAddress() throws SocketException
zh_cn
检测是否启用了 SO_REUSEADDR。
return
zh_cn
指示是否启用 SO_REUSEADDR 的 boolean 值。
ThrowsSocketException
zh_cn
如果底层协议出现错误,例如 UDP 错误。
since1.4
See alsosetReuseAddress(boolean)
public voidsetSendBufferSize(int size) throws SocketException
zh_cn
将此 DatagramSocket 的 SO_SNDBUF 选项设置为指定的值。网络实现使用 SO_SNDBUF 选项作为设置底层网络 I/O 缓冲区大小的提示。网络实现也可以使用 SO_SNDBUF 设置来决定在此套接字上可以传送的包的最大大小。

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

当发送率很高时,增大缓冲区的大小可以允许网络实现对多个传出包进行排队。

注:如果使用 #send(DatagramPacket) 来发送比 SO_SNDBUF 设置大的 DatagramPacket,包是被发送还是被丢弃是特定于实现的。

size
zh_cn
将设置的发送缓冲区大小。此值必须大于 0。
ThrowsSocketException
zh_cn
如果底层协议出现错误,例如 UDP 错误。
ThrowsIllegalArgumentException
zh_cn
如果值为 0 或负。
See alsogetSendBufferSize()

public intgetSendBufferSize() throws SocketException
zh_cn
获取此 DatagramSocket 的 SO_SNDBUF 选项的值,该值是平台在 DatagramSocket 上输出时使用的缓冲区大小。
return
zh_cn
此 DatagramSocket 的 SO_SNDBUF 选项的值。
ThrowsSocketException
zh_cn
如果底层协议出现错误,例如 UDP 错误。
See alsosetSendBufferSize
public voidsetSoTimeout(int timeout) throws SocketException
zh_cn
启用/禁用带有指定超时值的 SO_TIMEOUT,以毫秒为单位。将此选项设为非零的超时值时,对此 DatagramSocket 调用 receive() 将只阻塞此时间长度。如果超过超时值,将引发 java.net.SocketTimeoutException,虽然 DatagramSocket 仍旧有效。选项必须在进入阻塞操作前被启用才能生效。超时值必须是 > 0 的数。超时值为 0 被解释为无穷大超时值。
timeout
zh_cn
指定的以毫秒为单位的超时值。
ThrowsSocketException
zh_cn
如果底层协议出现错误,例如 UDP 错误。
sinceJDK1.1
See alsogetSoTimeout()
public intgetSoTimeout() throws SocketException
zh_cn
获取 SO_TIMEOUT 的设置。返回 0 意味着禁用了选项(即无穷大的超时值)。
return
zh_cn
SO_TIMEOUT 的设置。
ThrowsSocketException
zh_cn
如果底层协议出现错误,例如 UDP 错误。
sinceJDK1.1
See alsosetSoTimeout(int)
public voidsetTrafficClass(int tc) throws SocketException
zh_cn
为从此 DatagramSocket 上发送的数据报在 IP 数据报头中设置流量类别 (traffic class) 或服务类型八位组 (type-of-service octet)。由于底层网络实现可能忽略此值,应用程序应该将其视为一种提示。

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

注:

对于 Internet Protocol v4 该值由包含优先级和 TOS 字段的八位组组成,这在 RFC 1349 中有详细叙述。TOS 字段是由以下逐位或所得值创建的位集:

  • IPTOS_LOWCOST (0x02)
  • IPTOS_RELIABILITY (0x04)
  • IPTOS_THROUGHPUT (0x08)
  • IPTOS_LOWDELAY (0x10)
末尾的最低位常常被忽略,因为该位对应于 MBZ(必须为 0)位。

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

对于 Internet Protocol v6 tc 是将被放置到 IP 头部的 sin6_flowinfo 字段中的值。

tc
zh_cn
此位集的 int 值。
ThrowsSocketException
zh_cn
如果设置流量类别或服务类型时出现错误
since1.4
See alsogetTrafficClass

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

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

return
zh_cn
已经设置的流量类别或服务类型
ThrowsSocketException
zh_cn
如果获取流量类别或服务类型值时出现错误。
since1.4
See alsosetTrafficClass(int)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值