Java的UDP_DatagramSocket.connect()是做什么用的?

4

我最近看到了一篇关于Java UDP API的小教程,并查看了DatagramSocketDatagramPacket类的javadoc。类DatagramSocket包含多个connect()方法和一个disconnect()方法。但是UDP不是一种无连接协议吗?

这些connectdisconnect方法是做什么用的呢?


2
虽然UDP确实是无连接的,但您可以在UDP套接字上使用connect函数,但语义与TCP不同。有关更多信息,请参见例如此文档(第5.2节) - Some programmer dude
2个回答

7
DatagramSocket#connect(InetAddress address, int port)的javadocs中可以看到:

将套接字连接到此套接字的远程地址。 当套接字连接到远程地址时,数据包只能从该地址发送或接收。 默认情况下,数据报套接字未连接。

...

当套接字连接时,receivesend不会对传入和传出的数据包执行任何安全检查,除了匹配数据包和套接字的地址和端口。 在发送操作中,如果数据包的地址已设置且数据包的地址与套接字的地址不匹配,则会抛出一个IllegalArgumentException异常。连接到多播地址的套接字只能用于发送数据包。

因此,这并不是建立像TCP一样的“连接”的方法,而是一种防止将数据包发送或接收到其他地址的方法。

1

一个实际的使用案例是管理方法receive()的并发调用。

例如,您有2个与2个网络节点进行的不同通信流,分别在2个独立的控制流 / Thread-s中处理,每个Thread-s都在等待接收传入消息时被阻止。

现在,对于已断开连接的DatagramSocket,无法确定哪个Thread会捕获哪个消息。

但是,如果将每个套接字连接到其对应节点的地址,则传入消息会委派给正确的控制流。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接