2013-02-17 138 views
0

我有一个客户端/服务器程序,允许多个客户端通过服务器产生的线程提供服务。目前该程序只是与服务器通信,但我现在想重新设计程序,以便客户端可以与另一个客户端建立通信。 在设计这方面我没有太多的经验知道什么是正确的方向。最初我想通过服务器线程进行通信,但是我不知道如何通知另一个客户端想要建立通信的那个线程的客户端。客户端到客户端套接字通信

比如我想要传达的CLI从A到CLI N:

Cli A <---> SerThread A <------> Main Thread <------> SerThread N <---> Cli N 

我不知道Cli时N可以如何被告知的是,CLI A需要与之通信。

直到客户端从套接字读取它不会知道另一个客户端要与它通信。因此,如果Cli N处于等待用户输入状态,直到发送/接收它不知道。 我需要一种方法来立即通知客户端通信正在等待它。

我越想越觉得困惑,所以我可能需要一些指导,然后才正确地尝试设计它。

+0

客户端是否仍然首先连接到服务器?服务器不能告诉客户有关其他客户的信息吗? – Default 2013-02-17 12:07:20

+0

是的,但是客户端还没有完成的情况如何在套接字上接收,例如等待用户输入发送/接收。客户端只有在发送/接收完成后才会收到通知,并且这是用户的通知。有没有办法立即通知客户?我是否必须为此创建另一个套接字连接? – SmalekTF 2013-02-17 22:54:00

+1

客户端应该始终在recv()中被阻塞(或者,更可能在select()或poll()或某些等价函数中,只要字节可用于从服务器接收,就会返回)。一旦完成,服务器所要做的就是将适当的字节发送到客户端,这足以唤醒客户端并使其处理字节。 – 2013-02-17 23:52:43

回答

0

那么,你可以让它像交换机一样工作:) 我假设你想通过服务器建立2个客户端之间的连接吗? 如果是这样,你需要做的是给每个客户一个序列号。 然后用您正在搜索的客户端的信息从客户端向服务器发送“请求”。含有序列号的数据包。 然后,服务器可以将信息发送到连接的客户端列表。 在客户端,客户端将收到序列号感谢服务器。 如果客户端收到的序列号与自己的序列号匹配,那么客户端将返回true到服务器。如果不是,它会发出错误的。 然后,下一次将搜索该客户端时,服务器已经知道它在哪里,它将只将消息发送给该特定客户端。 如果客户端明显断开连接,则序列号将被删除,服务器将丢失关于该客户端的数据。

+0

是的,服务器可以发送消息,但我的问题是当服务器通知客户端,并且客户端没有在套接字上发起接收(等待用户输入)时,我该如何通知客户端?我唯一能想到的就是在每个客户端上创建辅助连接以接收来自其他客户端的请求。但我不确定是否有更好的方法来处理这个问题。 – SmalekTF 2013-02-17 22:52:13

0

我强烈建议你阅读Beej's Guide to Network,这是套餐编程的圣经。你有很多的例子,并逐步解释每一个功能,所以如果你花一些时间,你将能够理解一切。该指南还包含一个客户端 - 服务器连接的工作示例,您可以实际查找您拥有的问题。 通过阅读本指南,我学到了这种东西!我希望它有帮助! =)