gpt4 book ai didi

java - 测量通过 Java 套接字写入的实际字节数

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:53:57 26 4
gpt4 key购买 nike

我编写了一个小程序,可以从一个客户端向另一个客户端发送/接收文件。我已经为接收方和客户端都设置了进度条,但问题是发送方的进度条完成速度似乎比实际传输快得多。问题在于它如何计算已写入的字节数。我假设它计算的是我读入缓冲区的字节数,而不是通过网络发送的字节数,那么我怎样才能找到解决这个问题的方法呢?接收方正在以正确的速率计算他接收到的字节,但发送方没有正确完成他的部分。

设置较低的缓冲区大小可以稍微抵消差异,但仍然不正确。我试过用 CountingOutputStream 包装输出流,但它返回的结果与下面的代码片段相同。传输最终正确完成,但我需要正确的“已发送”值来更新我的进度条,就像在接收方实际收到并写入光盘的内容一样。我已经包含了一个非常精简的代码片段,它代表了我计算传输字节的方式。任何解决方案示例都会非常有帮助。

try
{
int sent = 0;
Socket sk = new Socket(ip, port);
OutputStream output = sk.getOutputStream();
FileInputStream file = new FileInputStream(filepath);

byte[] buffer = new byte[8092];

while ((bytesRead = file.read(buffer)) > 0)
{
output.write(buffer, 0, bytesRead);
sent += bytesRead;
System.out.println(sent); // Shows incorrect values for the actual speed.
}
}

最佳答案

简而言之,考虑到您与“线路”本身之间的缓冲区数量,我认为您无法仅从“发送方”端获得您正在寻找的那种准确可见性。而且,我认为这不重要。原因如下:

  1. 当字节被传递到网络堆栈时,字节算作“已发送”。当您发送少量字节(例如您的 8K 示例)时,这些字节将被缓冲并且 write() 调用将快速返回。

  2. 一旦达到网络饱和,您的 write() 调用将开始阻塞,因为各种网络缓冲区已满 - 因此您将真正了解时间安排。

  3. 如果您真的必须知道“您收到了多少字节?”您必须让接收端通过带外机制(例如 glowcoder 建议的)定期发回该数据

关于java - 测量通过 Java 套接字写入的实际字节数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7923608/

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