服务器/客户端聊天

时间:2012-11-27 22:01:23

标签: c++ sockets network-programming

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

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

因此,一对一通信通常由服务器代理,如在多对多的一般情况下,并且该实践效率低的程度是肤浅的。特殊用途的一对一通信(文件传输,VoIP等)通过服务器首先通常编排的直接客户端到客户端连接来完成(即,准备每一方进行直接通信)。

实施提示:服务器都是TCP。阅读有关非阻塞套接字,POSIX系统调用poll,并让您了解TCP上的消息框架。然后,您可以跳过服务器代码中的多线程[和可伸缩性]问题。客户端除了说出与服务器相同的自定义TCP协议外,还由您决定。