2012-11-27 259 views
1

我的想法是客户端可以连接到服务器上的聊天室并相互通信。在聊天室里,你也应该能够瞄准另一个用户,他们应该能够相互交谈。服务器/客户端聊天

现在来解决问题。我不确定哪种方式是最简单/最好的方式来实现这一点。对于我在用户写东西时想到的聊天室,消息被发送到服务器,然后服务器将该消息回复给其他客户端。不知道我有什么其他选项。

我最困惑的是我如何才能让两个客户互相交谈。无论是服务器充当代理,只是将消息转发给其他客户端,这似乎效率不高。我能想到的唯一替代方案是2个客户建立彼此之间的连接。为了达到这个目的,哪个实现是最常见的?

我使用的是C++的unix套接字。

+0

NAT客户端的情况如何?您想在P2P和客户端服务器之后重塑Skype ...:D Google – neagoegab

回答

1

有几个选项可用于多对多聊天和一对一聊天。然而,多对一聊天的唯一合理理智选择就是按照你的说法去做:向中央服务器发送消息,服务器将消息转发给所有其他连接的客户端(或者在同一个“房间” /“频道”)。

对于一对一聊天,我建议您遵循相同的确切模型:这只是一个特殊情况下的众多聊天中继,其中消息由服务器作为代理发送给另一个连接的客户端。这很简单,它隐藏每个客户的IP地址。

但是,如果一对一通信变得比聊天(例如,文件传输)更加庞大,则直接一对一通信可能是适当的。在这种情况下,服务器应该向远程用户中继直接的对等通信信道的发起,可能在设置时交换IP地址,然后客户端将直接相互连接以进行其专用直接通信(尽管通常可选地保持连接到服务器)。

因此,一对一沟通通常由服务器代理,就像一般情况下的多对多一样,并且这种做法效率低下的程度是肤浅的。特殊用途的一对一通信(文件传输,VoIP等)通常由直接的客户端到客户端连接来完成,通常由服务器协调(即,为每个端口准备直接通信)。

执行提示:服务器全是TCP。阅读有关非阻塞套接字的信息,POSIX系统调用poll,并让消息通过TCP构思的想法在您的脑海中滚动。然后您可以跳过服务器代码中的多线程[和可伸缩性]问题。除了与服务器讲同一个自定义的TCP协议之外,客户端由您决定。

1

那么你可以实现一个多线程客户端/服务器。一个中继消息的“服务器”是正确的途径(保持消息的全局排序)。例如,如果您的“服务器”出现故障,请考虑领导者选举算法(http://en.wikipedia.org/wiki/Bully_algorithm)。退房

另一种方法是使用信号和事件驱动的编程。