Java网络文件传输问题
我正在编写一个可以测量本地网络速度的小型java程序。 这是我第一次使用套接字,但我已经整理了一个有效的程序。 唯一的问题是测量结果远非准确(方式太低)。
这是服务器代码:
ServerSocket servsock = new ServerSocket(13267); while (true) { System.out.println("Waiting..."); Socket sock = servsock.accept(); System.out.println("Accepted connection : " + sock); File myFile = new File("test.txt"); FileInputStream in = new FileInputStream(myFile); OutputStream out = sock.getOutputStream(); int bytes = 0; byte[] buffer = new byte[8192]; int len; while ((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); bytes += len; } System.out.println("Transfer completed, " + bytes + " bytes sent"); out.flush(); sock.close(); }
这是客户端代码:
Socket sock = new Socket("192.168.0.100", 13267); System.out.println("Connecting to : " + sock); InputStream in = sock.getInputStream(); FileOutputStream out = new FileOutputStream("received.txt"); int bytes = 0; byte[] buffer = new byte[8192]; int len; long start = System.currentTimeMillis(); while ((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); bytes += len; } long end = System.currentTimeMillis(); out.close(); sock.close(); double kbps = (bytes / 1000) / ((end - start) / 1000); System.out.println("Speed: " + kbps + " kbps");
这是因为我正在使用我自己的缓冲区来减慢一切,或者可能是什么问题? 提示和提示也是受欢迎的。
如果要测量带宽,则无需发送文件,只需发送空白数据即可。 如果文件不够大,建立连接的成本(通常为20毫秒)将使您的连接显得缓慢。
我建议你发送至少2到10秒的数据。
本文提供了有关通过套接字传输数据的最快方法的示例代码。 Java套接字的速度有多快
使用整数运算生成浮点可能会出错。
double kbps = (bytes / 1000) / ((end - start) / 1000);
假设bytes
是2100, end - start
是1900你会得到
double kbps = (2100 / 1000) / (1900 / 1000); double kbps = 2 / 1; == 2.
几乎相同(但误差较小)
double kbps = bytes / (end - start);
更好
double kbps = (double) bytes / (end - start);
发送空白数据
byte[] bytes = new byte[8*1024]; OutputStream out = socket.getOutputStream(); // send data for given amount of time, eg 2000 ms long endTime = System.currentTimeMS() + timeToSendDataMS; do { out.write(bytes); } while(endTime > System.currentTimeMS());
读取空白数据
long total = 0; byte[] bytes = new byte[8*1024]; InputStream in = socket.getInputStream(); int len; while((len = in.read(bytes)) != -1) total += len;
这是因为您在客户端收到的每个8K包写入磁盘 。
FileOutputStream out = new FileOutputStream("received.txt"); ... while ((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); ... }
这对于速度测试不是必需的。 只需将字节读入缓冲区就足够了。 跳过将包写入客户端代码中的文件。 (可选)您可以将收到的包写入ByteArrayOutputStream
。 Java将在JVM的堆空间中处理分配。 并且它不会偏向速度测试。
您的代码无效。 你在错误的点结束计时器。 在刷新或关闭输出流之前,传输尚未完成。