我需要测量几个GPRS和3G BlackBerry设备的实际传输速率。由于这些数据取决于运营商和设备,并且大多数在线速度测试依赖于JavaScript,Flash或HTML5,因此我觉得需要开发自己的基准测试应用程序。
由于我没有任何服务器可以打开套接字,但我可以在公司使用多个HTTP服务器,我使用HTTPConnection
来获取文件(HTTP GET)并发布一个号码字节数(HTTP POST),然后测量经过的时间。下载速度似乎是正确的,并且与我在互联网上发现的已知速度范围一致,但上传测试产生了完全意外的结果,比下载速度高几倍,并且还高于理论上传速度限制。在模拟器和真实设备上进行测试。这是上传测试的代码:
Httpconnectionection connection = null;
OutputStream os = null;
try {
connection = getHttpconnectionection(url);
if(connection != null){
connection.setRequestMethod(Httpconnectionection.POST);
os = connection.openOutputStream();
for(int i = 0; i < numbytes; i++){
os.write(0);
}
os.flush();
int respCode = connection.getResponseCode();
if (respCode != Httpconnectionection.HTTP_OK) {
userMessage = "HTTP Response code: " + respCode + "\nMessage: " + connection.getResponseMessage();
}
} else {
userMessage = "unable to connnect";
}
} catch (IOException e) {
userMessage = e.toString();
} finally {
if(os != null){
try {
os.close();
} catch (IOException e) {}
}
if(connection != null){
try {
connection.close();
} catch (IOException e) {}
}
}
如果我在JavaSE或Android上执行类似的测试,这个测试是否正确?难道我做错了什么?我在这里很困惑。
我的第二个问题是更具针对性的BlackBerry:我知道在BlackBerry中,MDS会增加一些压缩。可能是模拟器和设备(我的所有设备都在BIS或BES上)压缩发送的数据(这些都是零,因此非常适合压缩)并且这样做测试不计算发送的实际字节数但压缩的?
更新:关于我的第二个问题,我怀疑MDS可能正在压缩,所以我改变了这一行的写行,为测试增加了恩惠:
os.write(i);
我还更新了测试工具以支持不同的连接模式,并使用TCP直接测试,如MrVincenzo建议的那样。这些是结果:
-------------------------------------------------------------
| Connection Mode | Mean Speed (3G) | Mean Speed(GPRS)|
-------------------------------------------------------------
| BIS | 390 Kbps | 90 Kbps |
| Direct TCP | 255 Kbps | 17 Kbps |
-------------------------------------------------------------
这证明了MDS压缩数据,我最初发送的一系列零很可能正在经历高压缩。现在,GPRS下直接TCP的17 Kbps对我来说听起来更合理。
答案 0 :(得分:2)
我既没有在JavaSE上也没在Android上工作,但恕我直言,你的上传测试的概念似乎是正确的,我会做同样的一个区别。我会打开SocketConnection
(到HTTP服务器或专用服务器)而不是HttpConnection
。原因更多地基于直觉然后基于真实事实
如果您决定使用专用服务器,则应考虑 Amazon EC2按需实例,它提供每小时使用和非常低价格的专用服务器。我过去曾用它们进行压力和负载测试。
至于第二个问题,我建议如果可能的话,用直接TCP连接重复测试,看看会发生什么。这样,您就可以确定MDS是否压缩发送的数据。
答案 1 :(得分:0)
使用直接TCP连接运行代码,并将deviceside=true
添加到网址,即Connector.open()
传递。这可能对你有帮助。