【问题标题】:Threading model for UDP/Socket communication in server side服务器端 UDP/Socket 通信的线程模型
【发布时间】:2018-03-28 18:28:57
【问题描述】:

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

【问题讨论】:

  • 对于 UDP,带有单个套接字的单个线程通常就足够了——只需对所有 UDP I/O 使用 sendto() 和 recvfrom()(并避免 send()、recv()、和连接())。

标签: multithreading sockets tcp udp


【解决方案1】:

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

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

所以如果我有 100 个客户端连接到服务器,那么就有 100 个线程用于此。

Bzzt。你没有。 UDP 中没有“已连接”之类的东西。

有没有其他线程模型,比如一些线程池。

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

同样的问题也适用于 TCP。

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

  1. 每个接受的套接字都有一个线程,可能从线程池中分配,或者
  2. 非阻塞多路复用 NIO,同样可能带有用于准备回复的线程池,或者
  3. 异步 I/O。

【讨论】:

  • 感谢您的回答...我还有一个关于 TCP 套接字的问题,“每个接受的套接字一个线程,可能从线程池分配”:如果我从线程池执行此操作,那么我必须将与服务器通信的客户端数量限制为池中的线程数?如果没有怎么办?你能解释一下吗
  • 你有一个接受循环。您有一个阻塞线程池。它在满时阻塞,然后给你一个线程。所以接受循环可以将一个接受的套接字分派给一个线程,然后返回接受另一个连接。当它被阻塞时,它不接受连接,所以积压队列正在填满,当它满时做任何事情(这取决于平台),并且当服务器的积压队列时,相关的客户端正在做他们所做的任何事情已满……实际上没有一个得到维修。这就是你想要的。
  • 或者您有一个非阻塞线程池,它接受无限数量的任务,并且仅在空闲线程可用时才调度它们。从accept() 循环和客户端的角度来看,这是不太可取的。
猜你喜欢
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多