任何人都可以指出任何示例代码来解释(甚至稍微解释一下)如何为 Android 编写一个简单的 wifi 速度测试程序吗?我到处都看过了!
提前致谢!
-迈克尔
最佳答案
这并不容易。让我给你一些建议,但你需要进行更多调查。
我不确定是否可以访问 WiFi 连接或 3G 连接的低级别指标。假设这不可能,我的建议是针对某些服务器使用 ping 或类似 ping 的解决方案并获取往返时间 (RTT)。
现在,当您连接到服务器时,影响 RTT 的因素有很多,这些是主要因素:
- WiFi 速度、拥塞和通信错误
- 服务器整个路径的延迟,包括 ISP 容量和主干网。
- 道路拥堵
- 服务器响应速度
通常您执行 ping 以测试可达性和 RTT 体验。 Ping 是通过 ICMP Echo Request 实现的。但是,Java 不提供发送 ICMP 消息的方法。因此,您可能会尝试与某些服务器建立 TCP 连接。
您可以多次使用带超时的 InetAddress::isReachable,直到找到限制超时。我不推荐这个。
http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html#isReachable(int)
我会创建一个 TCP 套接字并调用 connect,然后确定自调用 connect 以来所花费的时间。当然,您必须处理所有影响速度的因素。
另一点要考虑的是,如果你在TCP套接字中使用connect,你必须明白实际上有一个三向握手:客户端发送SYNC,服务器发送SYN/ACK,客户端发送ACK。但是最后一个 ACK 并没有显着增加连接返回的时间,因为它只是由客户端发送的。
话虽如此,我会提出一些建议:
我会尝试的第一件事,仅使用 WiFi,尝试建立到接入点的连接,连接到端口 80、8080 或 443。这将消除最后三个因素。
如果它不起作用,您可以尝试修复服务器,例如 www.google.com。在这种情况下,您将不得不处理所有提到的因素。
在 3G 的情况下,我不知道如何建立到接入点的连接,例如 UMTS 中的网关 GPRS 支持节点。但考虑到上述所有 4 个因素,您可以连接到修复服务器。
要考虑的另一点是,当智能手机连接到 WiFi 和蜂窝网络时,它始终使用 WiFi。有一些方法可以强制它使用 3g,一些链接: Android: Force data to be sent over radio vs WiFi Force Android to use 3G when on local area wifi without net access
希望对您有所帮助。
关于android - Android 上的简单速度测试应用程序建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24075089/