多对多聊天和一对一聊天有几个选项。但是,多对多聊天的唯一合理选择是按照您所说的那样做:向集中式服务器发送消息,服务器将消息中继给所有其他连接的客户端(或者,在同一个“房间”中) / “渠道”)。
对于一对一聊天,我建议您遵循相同的确切模型:这只是多对多聊天中继的一种特殊情况,其中消息由服务器作为代理仅发送给另一个连接的客户端. 这很简单,它隐藏了每个客户端的 IP 地址。
然而,如果一对一通信变得比聊天(例如,文件传输)更多,则直接的一对一通信可能是合适的。在这种情况下,服务器应该将直接的点对点通信通道的启动中继给远程用户,可能会在设置时交换 IP 地址,然后客户端将直接相互连接以进行特殊目的的直接通信(虽然通常(尽管可选)保持与服务器的连接)。
因此,一对一的通信通常由服务器代理,就像在多对多的一般情况下一样,这种做法效率低下的程度是肤浅的。特殊用途的一对一通信(文件传输、VoIP 等)是通过通常首先由服务器编排的直接客户端到客户端连接完成的(即,为直接通信的每一方做好准备)。
实现提示:服务器全部为TCP。阅读有关非阻塞套接字、POSIX 系统调用poll
的信息,并让基于 TCP 的消息成帧的想法在您的脑海中盘旋。然后,您可以跳过服务器代码中的多线程 [和可伸缩性] 问题。除了与您的服务器使用相同的自定义 TCP 协议外,客户端由您决定。