我有两台无线计算机连接到 N 个无线路由器。每台 PC 的连接速度都在 108-150Mbps 之间。
理论上,在绝对最佳的条件下,我应该能够以 13.5MB/s 到 18.75MB/s 的速度传输。
第一台计算机(正在发送)使用非常快的 SSD,如果我没记错的话,速度约为 100MB/s。 CPU 使用率也保持在 20% 以下。
它在 656367 毫秒内发送了 1960273535 字节 (1.8GB)。即 2.8MB/s(108 兆比特中的 22 兆比特)。
当我打开任务管理器时,我发现只有 25-27% 的网络连接正在使用。
我正在寻找任何可以使传输更快(通过网络)的想法、建议或改进。我正在考虑在一个线程上缓冲磁盘上的文件并从另一个线程发送缓冲的数据,但我不确定这是否是一个好主意。
这是 SSCCE:
Host:
import java.io.*;
import java.net.*;
public class Host {
public static void main(String[] args) throws IOException {
ServerSocket servsock = new ServerSocket(15064);
Socket sock = servsock.accept();
long time = System.currentTimeMillis();
OutputStream out = sock.getOutputStream();
FileInputStream fileInputStream = new FileInputStream("C:\\complete.rar");
byte [] buffer = new byte[64*1024];
int bytesRead = 0;
long totalSent = 0;
while ( (bytesRead = fileInputStream.read(buffer)) != -1)
{
if (bytesRead > 0)
{
out.write(buffer, 0, bytesRead);
totalSent += bytesRead;
System.out.println("sent " + totalSent);
}
}
sock.close();
System.out.println("Sent " + totalSent + " bytes in "
+ (System.currentTimeMillis() - time) + "ms.");
}
}
Client:
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) throws Exception {
Socket sock = new Socket("127.0.0.1", 15064);
InputStream in = sock.getInputStream();
FileOutputStream fileOutputStream = new FileOutputStream("output.rar");
byte [] buffer = new byte[64*1024];
int bytesRead = 0;
while ( (bytesRead = in.read(buffer)) != -1)
fileOutputStream.write(buffer, 0, bytesRead);
sock.close();
fileOutputStream.close();
}
}
编辑:我尝试映射网络驱动器并通过该驱动器发送文件,Windows 的表现甚至更糟 - 2.35MB/s。根据映射网络驱动器比 FTP 更快,而且我也没有时间去玩和设置 FTP 服务器。
Edit2:更改计时器后,结果发现它通过 WiFi 以 3MB/s 的速度传输。我讨厌“理论”吞吐量。当我买东西时,我想知道它的真实性能。
事实证明,该代码确实受到 WiFi 速度的限制。不过,我仍然愿意接受建议。
编辑 3:在 100Mbps LAN 上运行该程序后,它成功以 11.8MB/s 的速度传输文件。考虑到最大传输速率为 12.5MB/s,这已经相当不错了。