工信部规定的网速测试标准 : 除普通网页测速采用单线程外,用户宽带接入速率测试应使用多线程(多TCP连接)HTTP下载进行测速,测试中使用的线程数量为N(N≥4)。
-- 建立连接 : 用户终端设备发起测试请求后,与测速平台建立 N 条 TCP 连接,并在每一条 TCP 连接上发送HTTP[GET]请求发起一次测试过程。
-- 请求文件 : 对每一个 HTTP[GET]请求,宽带接入速率测试平台以 HTTP 200 OK 响应,并开始传送测速文件。
-- 下载文件 : 对每一条连接,宽带接入速率测试平台持续从内存直接发送 64kByte 大小的内容。
-- 平均速率 : 从收到第 1 个 HTTP[GET]请求开始计时,宽带接入速率测试平台及客户端软件每隔 1s 统计已经发送的文件大小,计算数据平均传送速率,并在网页上或客户端中实时更新。
-- 实时速率 : 宽带接入速率测试平台同时计算每 1s 间隔内的实时数据传送速率。
-- 测量时间 : 15s 后宽带接入速率测试平台停止发送数据,计算第 5s 到第 15s 之间共计 10s 的平均速率及峰值速率,峰值速率为步骤 5)中的每秒实时速率的最大值.
一. 网速测试核心代码
从GitHub上下载的源码, 应该没有按照工信部的标准写的;
在 GitHub 上找到的网速测试的核心代码 :
-- GitHub 地址 : https://github.com/Mobiperf/Speedometer.git ;
- /** Runs the HTTP measurement task. Will acquire power lock to ensure wifi is not turned off */
- @Override
- public MeasurementResult call() throws MeasurementError {
- int statusCode = HttpTask.DEFAULT_STATUS_CODE;
- long duration = 0;
- long originalHeadersLen = 0;
- long originalBodyLen;
- String headers = null;
- ByteBuffer body = ByteBuffer.allocate(HttpTask.MAX_BODY_SIZE_TO_UPLOAD);
- boolean success = false;
- String errorMsg = "";
- InputStream inputStream = null;
- try {
- // set the download URL, a URL that points to a file on the Internet
- // this is the file to be downloaded
- HttpDesc task = (HttpDesc) this.measurementDesc;
- String urlStr = task.url;
- // TODO(Wenjie): Need to set timeout for the HTTP methods
- httpClient = AndroidHttpClient.newInstance(Util.prepareUserAgent(this.parent));
- HttpRequestBase request = null;
- if (task.method.compareToIgnoreCase("head") == 0) {
- request = new HttpHead(urlStr);
- } else if (task.method.compareToIgnoreCase("get") == 0) {
- request = new HttpGet(urlStr);
- } else if (task.method.compareToIgnoreCase("post") == 0) {
- request = new HttpPost(urlStr);
- HttpPost postRequest = (HttpPost) request;
- postRequest.setEntity(new StringEntity(task.body));
- } else {
- // Use GET by default
- request = new HttpGet(urlStr);
- }
- if (task.headers != null && task.headers.trim().length() > 0) {
- for (String headerLine : task.headers.split("\r\n")) {
- String tokens[] = headerLine.split(":");
- if (tokens.length == 2) {
- request.addHeader(tokens[0], tokens[1]);
- } else {
- throw new MeasurementError("Incorrect header line: " + headerLine);
- }
- }
- }
- byte[] readBuffer = new byte[HttpTask.READ_BUFFER_SIZE];
- int readLen;
- int totalBodyLen = 0