我最近看过一个关于Java的UDP API的小教程,我查看了DatagramSocket
和DatagramPacket
类的javadoc。课程DatagramSocket
包含多个connect()
和一个disconnect()
方法。但UDP不是没有连接的协议吗?
这些connect
和disconnect
方法有何作用?
答案 0 :(得分:4)
来自DatagramSocket#connect(InetAddress address, int port)的javadoc:
将套接字连接到此套接字的远程地址。 当套接字连接到远程地址时,只能将数据包发送到该地址或从该地址接收。默认情况下,数据报套接字未连接。
...
连接套接字时,
receive
和send
不会对传入和传出的数据包执行任何安全检查,除了匹配数据包和套接字的地址和端口。 在发送操作中,如果数据包的地址已设置且数据包的地址与套接字地址不匹配,则会引发IllegalArgumentException
。连接到多播地址的套接字只能用于发送数据包。
因此,它不是以与TCP相同的方式建立“连接”的方式,而是一种防止向/从其他地址发送或接收数据包的方法。
答案 1 :(得分:0)
一个实际用例是管理方法receive()
的并发调用。
例如您有2个与2个网络节点的单独通信流,分别在2个中处理
分隔的控制流/ Thread
-s,每个Thread
-s在receive
上被阻止以接收传入消息。
现在,DatagramSocket
处于断开状态时,Thread
会捕获什么消息。
但是,如果将每个套接字连接到其相应节点的地址,则传入的消息将委派给正确的控制流。