点对点通信选项

28

有人能确认目前在Android框架中允许使用的点对点通信方法吗?我需要传输JSON字符串,目前我正在使用短信,虽然可以正常工作,但问题是数据也会以很多文本消息的形式出现。我已经阅读了Reto Meier的Android应用开发专业版第一版,在其中他说由于安全问题,数据传输选项未得到实现。

这种情况是否有所改变,并且您怎样进行点对点数据传输?


蓝牙?不是吧?http://developer.android.com/guide/topics/wireless/bluetooth.html - Aidanc
2
不,假设它们互相之间远离。 - John J Smith
@ChrisF - 这不是那个问题的重复,因为另一个问题是关于“即席”WiFi网络,而这个问题没有这样的限制,并且有回答涉及其他网络模式,如3g。 - Chris Stratton
Google Games API声称使用点对点连接进行实时游戏。我也想知道它内部是如何工作的。 - Dzmitry Lazerka
4个回答

22

你看过高通的AllJoyn库吗?它旨在通过蓝牙或wifi工作,因此可能适合,但如果您要连接到3G或更广泛的范围网络,则无法使用。

考虑到两个不在同一网络上的远程设备之间的网络差异和可靠性,我会质疑点对点是否是最佳解决方案,并建议考虑在中间使用应用服务器,这样您就可以使用Cloud to Device Messaging[已弃用](可能与Google App Engine一起使用)。 也就是说,发送方将消息传递给服务器,服务器然后将其传递给接收方。

理论上,网络上的所有设备都具有唯一的IP地址并且可以相互通信,但事实往往并非如此简单,因为路由器/防火墙的配置不同,因此您需要特别注意所使用的端口,特别是考虑到出于安全原因,默认情况下许多入站端口都被阻止。


谢谢Ollie。C2DM看起来确实很有趣。 - John J Smith
太好了!如果我们可以通过这个库进行广播等操作,那么这个功能可能会正常工作 :D - gumuruh
C2DM现在是Google云消息传递(GCM)。 https://developers.google.com/cloud-messaging/ 值得一看:C2DM由迷人的Vic Gundotra在2010年I/O上介绍:https://www.youtube.com/watch?feature=player_embedded&v=IY3U2GXhz44 - Gunnar Forsgren - Mobimation
我有类似的问题 - 问题 https://dev59.com/VWMm5IYBdhLWcg3wlvwK - Muhammad Usman Bashir

6

2
如果其中一个Android设备在防火墙/内网后面,那该怎么办呢?这个解决方案似乎就会失败。 - pshirishreddy
在这种情况下你不能使用UDP,你需要一个中间服务器来让两个设备进行通信。 - Phil Haigh

4
你还应该看看开源项目peerdroid,可以在这里找到。我从拥有联邦设备集合(预匹配,类似于蓝牙配对)的角度研究了点对点通信选项;这个库看起来可能为你所尝试做的事情提供了基础。
如果你在自己的网络上(例如家庭或办公室WiFi),那么你应该能够查询其他连接的设备。如果你所在的网络不在你的掌控之下(移动网络或公共WiFi),则网络将被配置为隔离每个设备与其他所有设备的联系。在这种情况下,你别无选择,只能设置一个服务器作为中间人。这带来了自己的架构妥协 - 每个设备都必须定期轮询服务器或保持连接打开 - 除非你使用Google App Engine,它支持通过Google自己的基础设施推送通知。

@Gopal,如果没有服务器本身,那怎么样?是否可以通过他们自己的WIFI访问从Android!到Android B。不是通过服务器,而是直接使用Wifi。 - gumuruh
@gumuruh 是的,在您自己的网络上这是完全可能的。我已经编写了一个原型应用程序,它使用UDP来发现运行相同应用程序的其他Android设备,并通过“配对”过程进行连接。一旦配对成功,该应用程序允许一个设备使用另一个设备上的硬件 - 例如,平板电脑上的应用程序使用与其配对的手机发送短信。只要在您的子网上允许UDP,您就可以毫无问题地完成此操作。尽管设置过程比较复杂。 - Phil Haigh
好的,我明白了主要思路,一旦设备正在广播其可用性,那么其他设备就可以捕获状态,对吧?我懂了,我懂了……Phil,你在哪里找到了这个“非常长的教程”呢? - gumuruh
@gumuruh 没有一个标准的方法...我花了很多时间辛苦地摸索出来。 - Phil Haigh
所以我们在这里有什么......如果您的设备位于不同的网络并且想要通信,您有两个选项。一个是使用服务器,另一个是使用Google推送,对吗?除此之外它们没有直接通信的其他方式了吗? - Sagar Nayak
显示剩余3条评论

1

感谢您的回答ldx,但我需要像您所指示的对等发现。进一步的研究表明XMPP是一种合适的技术,并且现在有一些服务提供,尽管这些服务似乎针对“服务器”到客户端的通知。这里有一个关于XMPP的良好讨论here,还有一些more here,尽管似乎仍然存在一些问题需要解决,例如轮询与推送、长时间运行的开放HTTP连接和电池寿命。Xtify看起来很有前途,特别是他们的Web服务。我希望这为其他研究点对点数据通信主题的人提供了合适的信息。


自从提出这个问题并研究了一些答案后,我决定实施Google的C2DM。我希望这是正确的决定,因为它目前仍处于“实验室”阶段,可能会被撤回。 - John J Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接