您将以哪种方式设计设备之间的这种相互通信

时间:2015-10-20 17:25:58

标签: android

我有一个设计问题。你会怎么做到这一点?

我有一个设备池。设备A想要与设备B通信并开始聊天会话。我在这里看到两个选项,请告诉我是否有更常见的第三个选项:

1-Device A向服务器发送一个msg,将其推送到B,反之亦然。这是针对每个文本消息完成的。

2-设备A向服务器发送消息,然后向设备B发送消息,表示要与其IP信息聊天。设备A启动套接字服务器。设备B(作为客户端)使用套接字连接到设备A.发送文本消息

请告诉我适当的设计或我应该考虑的事项

PS 1:通过Push msg,我指的是云消息传递。

PS 2:设备未关闭。所以无线或蓝牙是不可能的

3 个答案:

答案 0 :(得分:1)

正如你的问题是

  

你会怎么做?

我会告诉你我的观点。这个答案不是正确答案,因为 正确答案并不存在。

您如何处理此问题取决于您预期会有多少聊天。简单地说,方法1更容易实现,但方法2在服务器上更轻。尽管如此,还有一些专业人士和小伙伴。 方法1:

  1. 允许轻松进行群聊。您可以让服务器将其发送给每个人。
  2. 易于实施。或者,最简单的2。
  3. 允许聊天记录。您可以将历史记录存储在服务器上,并允许用户使用其他设备进行查找。
  4. 服务器上很重。一旦你开了几个聊天,一次说20个,便宜的服务器就会开始变得紧张。
  5. 方法2,也称为hole punching

    1. 服务器上非常亮。唯一需要发送的信息就是一个人说#34;有人想和你聊天,在这里找到他"。
    2. 难以实施。您可以为它找到一个库,但实际上自己实施打孔可能相当棘手。
    3. 不太稳定。如果连接丢失,则必须重新开始聊天。
    4. <强> 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)

第一个选项是最好的选项,因为(但不限于)以下原因:

  1. 云消息传递由其他人实施和支持!例如,Google Cloud Messaging由Google管理,他们拥有的资源远远超出您的管理范围。这意味着您不必担心消息如何发送给收件人,您可以放心,确实如此!
  2. 如果每个人都是&#34;客户&#34;以后可以更轻松地实施群组对话。并且服务器是&#34;主机&#34;。