Android 广播超过 3g

标签 android tcp udp broadcast 3g

我正处于编写需要向多个其他设备广播数据的应用程序的早期阶段。

我的第一个想法是使用 UDP 广播,但是根据两者 http://code.google.com/p/boxeeremote/wiki/AndroidUDPAndroid 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/

相关文章:

node.js - 使用 HTTP/2 从 chrome 到 node-http2 服务器时看到多个 TCP 连接

c - 使用 UDP 发送字符

iphone - 如何从 GCDAsyncUdpSocket 初始化和实例化

tcp - 如何从命令行将主机名传递给 gen_tcp

android - Gradle 7.2 : How to apply a custom Gradle SETTINGS plugin?

android - android中的真实背景图像大小(带状态栏)

java - 将多个图像或文件上传到 firebase 中的存储并获取其 uri 并将 uri 放入数据库中

networking - Google 的 QUIC 有独立的库吗?

java - 使用 UDP 的服务器-客户端

android - 由于其他模块中的 Relinker 库类重复,构建失败