我有一个设计问题。你会怎么做到这一点?
我有一个设备池。设备A想要与设备B通信并开始聊天会话。我在这里看到两个选项,请告诉我是否有更常见的第三个选项:
1-Device A向服务器发送一个msg,将其推送到B,反之亦然。这是针对每个文本消息完成的。
2-设备A向服务器发送消息,然后向设备B发送消息,表示要与其IP信息聊天。设备A启动套接字服务器。设备B(作为客户端)使用套接字连接到设备A.发送文本消息
请告诉我适当的设计或我应该考虑的事项
PS 1:通过Push msg,我指的是云消息传递。
PS 2:设备未关闭。所以无线或蓝牙是不可能的
答案 0 :(得分:1)
正如你的问题是
你会怎么做?
我会告诉你我的观点。这个答案不是正确答案,因为 正确答案并不存在。
您如何处理此问题取决于您预期会有多少聊天。简单地说,方法1更容易实现,但方法2在服务器上更轻。尽管如此,还有一些专业人士和小伙伴。 方法1:
方法2,也称为hole punching:
<强> TL; DR:强> 如果您不熟悉聊天系统(或任何其他在线系统),除非您正在寻找挑战,否则不要去打洞。使用方法1。
当你问其他方法的时候,我也不会知道我的头脑,而是P2P的危险水域。对于多个客户端来说,这种方法几乎是打孔的。提前警告,这可能非常难以实施。这个想法相对简单
你有一台服务器,与打孔几乎一样。您(A)告诉您要加入,服务器告诉其他人(B)您想加入
(B)向您发送消息,并启动与您的连接。
现在(C)想加入。服务器将(C)重定向到(B),它们都连接。 (B)连接到(A),并告诉(A)和(C)连接。现在所有(A),(B)和(C)都有直接的联系。
(A)发送消息。这是通过将其发送到(B)和(C)来完成的,非常简单。
现在说另一个用户(D)想要加入但不能直接连接到(A)。然而,他可以连接到(B)。
(A)发送另一条消息。 (B)得到这个消息,并将它发送给他认识的每个人。这种方式(D)也得到这个消息。但是,(C)得到它两次。为防止它显示两次,每个客户端都会保留已发送和已接收消息的列表,并且不再重新发送已发送过一次的消息。
如上所述,这将非常难以实施,而且往往不值得。其中一个问题就是说用户(B)离线,服务器只知道他,没有人可以连接到现有的#34;聊天&#34;更多。要处理这个问题,服务器必须跟踪每个客户端。它比服务器方法1更容易在服务器上运行,但比方法2更重。但它确实允许组聊天。有关P2P的更多解释,请参阅https://en.wikipedia.org/wiki/Peer-to-peer
答案 1 :(得分:1)
您希望使用选项1.选项2的问题是设备可能位于防火墙或NAT服务器后面。所以它甚至可能都不知道&#34;真的&#34; IP地址。例如,设备的IP将类似于192.168.0.25,但对于外部世界,它将成为公共IP地址,而不是192.168.0.25。即使设备在端口上侦听,防火墙也可能会阻止传入连接。
答案 2 :(得分:0)
第一个选项是最好的选项,因为(但不限于)以下原因: