为什么 UDP 服务器不需要多线程来同时为多个客户端服务?

Why a UDP server need not be multi-threaded to serve several clients concurrently?

TCP 服务器(使用 java.io 包)应该是多线程的,以便它可以同时支持多个客户端。但是,UDP 服务器不需要多线程即可同时为多个客户端提供服务。谁能解释为什么会这样?

A (java.io) TCP 服务器需要是多线程的,因为与每个客户端的通信都是通过 io 流进行的。每次您 read/write 一条消息时,每个流的通信块。

UDP 服务器不通过 io 流进行通信。它通过同一通道上所有客户端的单个数据报直接通信。

假设您的服务器有 10 个客户端,它等待其中任何一个客户端发送。

  • TCP 需要 10 个线程,每个线程调用 InputStream#read() 方法并全部阻塞。在某一时刻 1 将被唤醒。 "message" 不需要包含发件人地址,因为这是通过流/连接暗示的。

  • UDP 需要 1 个调用 DatagramSocket#receive() 方法的线程。数据包将包含发件人地址,以便线程 1 可以决定要做什么。