gpt4 book ai didi

Java网络文件传输问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:25:10 25 4
gpt4 key购买 nike

我正在编写一个可以测量本地网络速度的小型 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 秒。

本文包含有关通过套接字传输数据的最快方式的示例代码。 How fast are Java sockets


使用整数运算产生 float 很可能会出错。

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;

关于Java网络文件传输问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6946104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com