【发布时间】:2011-10-27 23:25:06
【问题描述】:
我编写了一个小程序,可以将文件从一个客户端发送/接收到另一个客户端。我已经为接收方和客户端设置了进度条,但问题是发送方的进度条完成速度似乎比实际传输快得多。问题在于它如何计算已写入的字节数。我假设它正在计算我读入缓冲区的字节数,而不是通过网络发送的字节数,那么我怎样才能找到解决这个问题的方法呢?接收者正在以正确的速率计算他收到的字节,但发送者没有正确地完成他的工作。
设置较低的缓冲区大小会稍微抵消差异,但仍然不正确。我尝试使用 CountingOutputStream 包装输出流,但它返回的结果与下面的代码 sn-p 相同。传输最终正确完成,但我需要正确的“发送”值来更新我的进度条,就像在接收器端实际接收并写入磁盘的内容一样。我包含了一个非常精简的代码 sn-p,它代表了我计算传输字节的方式。任何解决方案的示例都会非常有帮助。
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.
}
}
【问题讨论】:
-
您可以尝试在 output.write() 调用之后立即在输出流上调用 flush(),这将刷新缓冲区并实际上导致数据通过网络发送。但是,缓冲区可以提高性能,如果您继续刷新(),性能可能会受到影响。
-
@prunge flush() not '实际上导致数据通过网络发送',实际上未修饰的套接字输出流上的 flush() 什么都不做.
-
@EJP 你是对的,查看源代码表明 flush() 什么都不做。我想减少延迟的方法可能是在套接字上设置 setTcpNoDelay(false),这将关闭Nagel's algorithm。
标签: java sockets networking progress-bar outputstream