【发布时间】:2013-02-17 12:03:08
【问题描述】:
我有一个客户端/服务器程序,它允许通过从服务器生成的线程为多个客户端提供服务。目前该程序仅与服务器通信,但是我现在想重新设计程序,以便客户端可以与另一个客户端建立通信。 在设计这个方面,我没有太多经验知道正确的方向是什么。最初我考虑通过服务器线程进行通信,但是我不确定如何通知该线程的客户端另一个客户端要建立通信。
例如我想从 cli A 到 cli N 通信:
Cli A <---> SerThread A <------> Main Thread <------> SerThread N <---> Cli N
我不确定如何通知 Cli N 需要与 Cli A 通信。
在客户端从套接字读取之前,它不会知道另一个客户端想要与它通信。因此,如果 Cli N 处于等待用户输入直到它发送/接收它不会知道的状态。 我需要一种方法来立即通知客户端正在等待通信。
我想得越多,我就越困惑,所以在我正确地尝试设计这个之前,我可能需要一些指导。
【问题讨论】:
-
客户端还在先连接服务器吗?服务器不能告诉客户端其他客户端的信息吗?
-
是的,但是如果客户端没有在套接字上完成接收,例如等待用户输入进行发送/接收,该怎么办。客户端只有在发送/接收时才会收到通知,这取决于用户。有没有办法立即通知客户?我是否必须为此创建另一个套接字连接?
-
客户端应该总是在 recv() 中阻塞(或者,更有可能在 select() 或 poll() 或一些等效的函数中,只要字节可以从服务器接收,就会返回)。一旦完成,服务器所要做的就是向客户端发送适当的字节,这足以唤醒客户端并让它处理字节。
-
您不应该在发送/接收之前等待用户输入。UI 线程和“套接字线程”应该是分开的。
-
是的,我相信最好在客户端设置一个单独的线程。感谢您提供的所有信息,我很困惑,现在意识到解决这个问题并不难。