Multithreading 服务器端UDP/Socket通信的线程模型

Multithreading 服务器端UDP/Socket通信的线程模型,multithreading,sockets,tcp,udp,Multithreading,Sockets,Tcp,Udp,在服务器端,对于一个UDP套接字文件描述符(从client connect()接收),我必须打开一个线程从每个客户端读取。 因此,如果我有100个客户端连接到服务器,那么就有100个线程。是否有其他线程模型,如线程池。 同样的问题也适用于TCP 在服务器端,对于一个UDP套接字文件描述符(从client connect()接收),我必须打开一个线程从每个客户端读取 不,你没有。你只需要一个线程来阅读。如果回复需要花费大量时间来准备,则可能需要多个回复线程 因此,如果我有100个客户端连接到服务器

在服务器端,对于一个UDP套接字文件描述符(从client connect()接收),我必须打开一个线程从每个客户端读取。 因此,如果我有100个客户端连接到服务器,那么就有100个线程。是否有其他线程模型,如线程池。 同样的问题也适用于TCP

在服务器端,对于一个UDP套接字文件描述符(从client connect()接收),我必须打开一个线程从每个客户端读取

不,你没有。你只需要一个线程来阅读。如果回复需要花费大量时间来准备,则可能需要多个回复线程

因此,如果我有100个客户端连接到服务器,那么就有100个线程

Bzzt。你没有。UDP中没有“已连接”这样的东西

是否有其他线程模型,如线程池

我当然会使用线程池来准备回复并发送它们

同样的问题也适用于TCP

完全不同的一壶鱼。您需要:

  • 每个接受套接字的线程,可能从线程池分配,或
  • 非阻塞多路复用NIO,也可能具有用于准备回复的线程池,或者
  • 异步I/O

  • 对于UDP,一个线程和一个套接字通常就足够了——只需对所有UDP I/O使用sendto()和recvfrom()(并避免使用send()、recv()和connect())。感谢您的回答。。。关于TCP套接字,我还有一个问题,“每个接受的套接字有一个线程,可能是从线程池分配的”:如果我从线程池执行此操作,那么我必须将与服务器通信的客户端数量限制为池中的线程数?如果不是,怎么做?你能再解释一下吗?你有一个接受循环。您有一个阻塞线程池。它在满的时候阻塞,然后给你一个线程。因此,accept循环可以将一个已接受的套接字分派给一个线程,然后返回以接受另一个连接。当它被阻塞时,它不接受连接,所以积压队列被填满了,当它满的时候做任何事情(这取决于平台),当服务器的积压队列满的时候,相关的客户机做任何事情。。。他们中没有一个真正得到服务。这就是你想要的。或者你有一个非阻塞线程池,它接受无限多的任务,并且只有在空闲线程可用时才发送它们。从
    accept()
    循环和客户端的角度来看,这是不可取的。