java 非阻塞UDP套接字是完全冗余的吗?

bqf10yzr  于 2023-03-28  发布在  Java
关注(0)|答案(1)|浏览(140)

为什么非阻塞UDP套接字不是完全没有意义?
我看不出使用它们比阻塞UDP套接字有什么好处,也不明白为什么它们作为一个构造存在。书籍没有解决这个问题。我错过了什么?

将我的理解情境化

我了解非阻塞TCP套接字编写可伸缩服务器的优势。(阻塞或非阻塞)表示到单个远程主机的连接,它只能从该主机发送和接收数据。因此,如果您有1个线程服务于多个连接,即每个线程有多个套接字示例,则如果其中一个阻塞,所以你需要一个每个连接1个线程的模型(即socket示例),但是这不能很好地扩展,因为每个线程都是有代价的(著名的C10 k问题)。
非阻塞IO解决了这个问题,它让一个线程为多个TCP连接服务。在Java中,Selector能够判断何时至少一个Channel准备好进行IO,并判断哪些Channel准备好了。非阻塞IO中的Selector是跨多个TCP套接字的多路复用器。
现在,在UDP中,DatagramSocket已经充当了多路复用器。

import java.net.{DatagramPacket, DatagramSocket}

val udpSocket = new DatagramSocket(<some-port>)
def run(): Unit = {
  val packet = new Datagrampacket(new Array[Byte](150), 150)
  udpSocket.receive(packet)
  // datagram contains the source IP and port.
  // do something with the datagram
  run()
}

当我从ANY远程UDP套接字接收数据时,阻塞的receive将返回。因此,由于UDP的性质,只能通过TCP中的非阻塞通道/选择器实现的行为可以通过阻塞UDP来实现。
这有道理吗?
1.如果是这样,为什么我们在Java中也有非阻塞UDP连接的概念?它们增加了什么价值?
1.我想底层的操作系统也有这样的结构?为什么?

von4xj4u

von4xj4u1#

当我从任何远程UDP套接字接收数据时,阻塞接收将返回。
未绑定的UDP套接字将从任何远程UDP套接字接收数据-只要它的目的地是本地套接字绑定到的特定IP和端口。因此,如果您希望在应用程序中有多个具有不同端口的UDP端点,则需要为此创建多个套接字。常见的用例是SIP,H.323,H.324,H.325,H.326,H.327,H.328,H.328,H.328,H.328,H.328,H.328,H.328,H.328,H.328,H.328,H.328,H.328,H.328,H.328,H.328,H.328,H.328,H.328,H.328,H.328,H.328,H.328,H.328,H.328,H.328,H.3WebRTC ...其中每个媒体通道通常使用不同的端口。
除此之外,实际绑定UDP套接字也很有用,这样一个套接字只从特定的远程端点接收数据。这可以使编程更容易,但也可以通过消除单个套接字瓶颈来帮助扩展应用程序。

相关问题