我最近看到了一篇关于Java UDP API的小教程,并查看了DatagramSocket
和DatagramPacket
类的javadoc。类DatagramSocket
包含多个connect()
方法和一个disconnect()
方法。但是UDP不是一种无连接协议吗?
这些connect
和disconnect
方法是做什么用的呢?
我最近看到了一篇关于Java UDP API的小教程,并查看了DatagramSocket
和DatagramPacket
类的javadoc。类DatagramSocket
包含多个connect()
方法和一个disconnect()
方法。但是UDP不是一种无连接协议吗?
这些connect
和disconnect
方法是做什么用的呢?
因此,这并不是建立像TCP一样的“连接”的方法,而是一种防止将数据包发送或接收到其他地址的方法。将套接字连接到此套接字的远程地址。 当套接字连接到远程地址时,数据包只能从该地址发送或接收。 默认情况下,数据报套接字未连接。
...
当套接字连接时,
receive
和send
不会对传入和传出的数据包执行任何安全检查,除了匹配数据包和套接字的地址和端口。 在发送操作中,如果数据包的地址已设置且数据包的地址与套接字的地址不匹配,则会抛出一个IllegalArgumentException
异常。连接到多播地址的套接字只能用于发送数据包。
一个实际的使用案例是管理方法receive()
的并发调用。
例如,您有2个与2个网络节点进行的不同通信流,分别在2个独立的控制流 / Thread
-s中处理,每个Thread
-s都在等待接收传入消息时被阻止。
现在,对于已断开连接的DatagramSocket
,无法确定哪个Thread
会捕获哪个消息。
但是,如果将每个套接字连接到其对应节点的地址,则传入消息会委派给正确的控制流。