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的堆空间中处理分配。 并且它不会偏向速度测试。

您的代码无效。 你在错误的点结束计时器。 在刷新或关闭输出流之前,传输尚未完成。