我正在编写一个可以测量本地网络速度的小型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");
这是因为我正在使用我自己的缓冲区来减慢一切,或者可能是什么问题?小贴士&也欢迎提示。
答案 0 :(得分:4)
如果要测量带宽,则无需发送文件,只需发送空白数据即可。如果文件不够大,建立连接的成本(通常为20毫秒)将使您的连接显得缓慢。
我建议你发送数据至少2到10秒。
本文提供了有关通过套接字传输数据的最快方法的示例代码。 How fast are Java sockets
使用整数运算生成浮点可能会出错。
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, e.g. 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;
答案 1 :(得分:0)
这是因为您写入磁盘您在客户端收到的每个8K软件包。
FileOutputStream out = new FileOutputStream("received.txt");
...
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
...
}
速度测试不需要这样做。只需将字节读入缓冲区就足够了。跳过将包写入客户端代码中的文件。
或者,您可以将收到的包写入ByteArrayOutputStream
。 Java将在JVM的堆空间中处理自身的分配。并且它不会影响速度测试。
答案 2 :(得分:0)
您的代码无效。你在错误的点结束计时器。在刷新或关闭输出流之前,传输尚未完成。