我正处于编写需要向多个其他设备广播数据的应用程序的早期阶段。
我的第一个想法是使用 UDP 广播,但是根据两者 http://code.google.com/p/boxeeremote/wiki/AndroidUDP和 Android 3G UDP Broadcast 在移动网络上时,UDP 将无法通过 NAT 推送 (这对我的应用至关重要)。
我知道我可以使用服务器进行广播,但我宁愿避免在我的家庭服务器上产生太多流量。
我能想到的最后一个替代方案是拥有多个 tcp/ip 连接并循环遍历所有连接的客户端并发送广播。但由于我指望至少有 30 名听众,我相信这会很昂贵。
我还没有任何广播相关的代码,这就是我没有发布任何代码的原因;)
有没有办法突破NAT?手机能否同时处理 30 个 TCP/IP 连接?或者我应该研究其他广播方法吗?
任何提示将不胜感激!
亲切的问候 约翰·里施
::::::::::::::::::::::::::已添加:::::::::::::::::::::::::::::::::: 我将每 30-360 秒发送一次长度为 10-20 个字符的字符串 (将由用户控制)包含字符串格式的地理点。发送数据的顺序并不重要,这就是我首先想到 udp 的原因。
我已经设置了我的服务器,以便当用户登录时他/她用他/她当前的 ip 更新我的数据库。
我希望它能在全局范围内工作,但只要它能在同一国家/地区的移动网络中工作。
这就是我能想到的所有相关信息,希望这能解决一些问题! :::::::::::::::::::::::::/添加:::::::::::::::::::::::::::::::::
最佳答案
NAT 不让 UDP 通过,因为 UDP 没有目标地址,所以从技术上讲,UDP 必须发送到网络的所有 子网。当网络是您的家庭 LAN 时,这没什么大不了的,但是当网络是您的 ISP 或大学 Backbone 或蜂窝提供商时,UDP 可以复制到数十万个子网。这是一场会降低每个人的网络性能的数据包 Storm ,而且对于您的特定应用来说,这是一种过大的杀伤力,因为您实际上只想与少数客户端通信。
这个问题已经解决了很多次了。 Instant Messaging 客户端与您的情况类似:希望尽可能通过防火墙直接进行 P2P 消息传递。他们是怎么做到的呢?原来的NAT穿越/防火墙穿越方案是架设消息中继服务器。所有客户端都与服务器通信,并且服务器根据需要将来自一个客户端的消息回显给其他客户端。它适用于 NAT 和防火墙,因为客户端启动与服务器的传出连接。
如果客户端能够建立对等连接,则中继服务器可以只给客户端彼此的 IP 地址并停止中继消息。
UPNP 是一种允许客户端请求防火墙为传入流量打开端口的协议(protocol)。 BitTorrent 客户端使用 UPNP 使客户端能够连接 P2P 进行文件共享。客户端通过 Torrent 服务器找到彼此。大多数家庭 LAN 防火墙路由器现在都支持 UPNP,但我似乎怀疑蜂窝网络提供商是否会为空中连接提供 UPNP 支持。
另一种(远程)可能性是多播 TCP/IP,但我记得这确实针对从服务器到客户端的“推送”内容流进行了优化,而不是客户端发起的点对点。
您最好的办法是查看现有的开源 IM 客户端,尤其是那些采用 Android 实现的客户端,看看它们是如何使用 IM 的。 Jabber是想到的一个,我敢肯定还有其他人。您甚至可以使用 IM 系统的消息传递 API 作为您的数据传输层,或多或少地完全避开有线级别的细节。
关于Android 广播超过 3g,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8525867/