ADatagramSocket
在断开连接时保持绑定,它是close()
解除绑定的方法。请注意,对于 UDP(数据报)套接字,与 TCP(或其他面向连接的)套接字相比,connect()
和的语义不同。disconnect()
UDP 是一种无连接协议,并且绑定DatagramSocket
可以在没有“连接”的情况下发送和接收数据包。该connect()
方法具有纯粹的本地效果,因为它使套接字只能向给定的主机/端口发送和接收数据包,即充当过滤器。连接到多播或广播地址的ADatagramSocket
将只能发送数据包而不能接收它们。
bind(SocketAddress)
用于将套接字附加到本地地址/端口组合,在绑定套接字之前它不能接收或发送任何数据包。构造函数的默认行为是立即绑定套接字。要创建未绑定的“DatagramSocket”,请使用作为参数DatagramSocket(SocketAddress)
传递的构造函数。null
然后可以在绑定之前将任何自定义配置应用于套接字bind()
。
据我所知DatagramSocket
,超出范围的打开会导致资源泄漏,该对象可能会被垃圾收集,但我很确定底层 UDP 套接字将保持由操作系统分配,直到 JVM 进程退出。
如果在绑定套接字之前未指定地址,则绑定时它将附加到通配符地址(INADDR_ANY
),使其能够从任何可用的本地地址接收和发送数据包(除非它稍后“连接”到某个主机)。如果未指定端口(或指定为 0),则套接字将绑定到操作系统选择的某个可用端口(临时端口)。
编辑:一个例子
// bind to INADDR_ANY, allowing packets on all IP addresses of host:
DatagramSocket dsock = new DatagramSocket(55555);
DatagramPacket packet = new DatagramPacket(new byte[8192]);
//next packet can be from anywhere including local host (127.0.0.0/8)
dsock.receive(packet);
// restrict communication to a single host/port:
dsock.connect(new InetSocketAddress("somehost.net", 99));
// next packet can only be from somehost.net on port 99:
dsock.receive(packet);