为什么 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 可以决定要做什么。
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 可以决定要做什么。