1

我的想法是客户端可以连接到服务器上的聊天室并相互通信。在聊天室中,您还应该能够定位另一个用户,并且他们应该能够相互交谈。

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

我最困惑的是我如何才能让只有 2 个客户互相交谈。服务器充当代理并将消息转发给另一个客户端,但这似乎效率低下。我能想到的唯一替代方法是 2 个客户端在彼此之间建立连接。为了实现这一目标,哪种实现最常见?

我正在使用带有 C++ 的 unix 套接字。

4

2 回答 2

1

多对多聊天和一对一聊天有几个选项。但是,多对多聊天的唯一合理选择是按照您所说的那样做:向集中式服务器发送消息,服务器将消息中继给所有其他连接的客户端(或者,在同一个“房间”中) / “渠道”)。

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

然而,如果一对一通信变得比聊天(例如,文件传输)更多,则直接的一对一通信可能是合适的。在这种情况下,服务器应该将直接的点对点通信通道的启动中继给远程用户,可能会在设置时交换 IP 地址,然后客户端将直接相互连接以进行特殊目的的直接通信(虽然通常(尽管可选)保持与服务器的连接)。

因此,一对一的通信通常由服务器代理,就像在多对多的一般情况下一样,这种做法效率低下的程度是肤浅的。特殊用途的一对一通信(文件传输、VoIP 等)是通过通常首先由服务器编排的直接客户端到客户端连接完成的(即,为直接通信的每一方做好准备)。

实现提示:服务器全部为TCP。阅读有关非阻塞套接字、POSIX 系统调用poll的信息,并让基于 TCP 的消息成帧的想法在您的脑海中盘旋。然后,您可以跳过服务器代码中的多线程 [和可伸缩性] 问题。除了与您的服务器使用相同的自定义 TCP 协议外,客户端由您决定。

于 2012-11-28T07:42:26.453 回答
1

那么你可以实现一个多线程的客户端/服务器。中继消息的单个“服务器”是正确的方法(保持消息的全局顺序)。还要考虑领导选举算法(http://en.wikipedia.org/wiki/Bully_algorithm),例如,以防您的“服务器”出现故障。查看

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

于 2012-11-27T22:09:18.100 回答