【问题标题】:Server/client chat服务器/客户端聊天
【发布时间】:2012-11-27 22:01:23
【问题描述】:

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

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

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

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

【问题讨论】:

  • 客户端后面的 NAT 怎么样?你想重塑 Skype... :D Google 在 P2P 和 Client-Server 之后

标签: c++ sockets network-programming


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-10-04
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      • 2014-05-17
      • 2017-07-06
      • 1970-01-01
      相关资源
      最近更新 更多