Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用TCP通过网络传输文件(加快传输速度)_Java_Performance_Sockets_Networking - Fatal编程技术网

Java 使用TCP通过网络传输文件(加快传输速度)

Java 使用TCP通过网络传输文件(加快传输速度),java,performance,sockets,networking,Java,Performance,Sockets,Networking,我一直试图通过套接字连接发送一个大文件,但它运行缓慢,我想知道是否可以通过某种方式优化此代码以提高传输速度 这是我发送文件的代码: byte[] buffer = new byte[65536]; int number; while ((number = fileInputStream.read(buffer)) != -1) { socketOutputStream.write(buffer, 0, number); } socketOutputStream.close(); fi

我一直试图通过
套接字
连接发送一个大文件,但它运行缓慢,我想知道是否可以通过某种方式优化此代码以提高传输速度

这是我发送文件的代码:

byte[] buffer = new byte[65536];
int number;

while ((number = fileInputStream.read(buffer)) != -1) {
    socketOutputStream.write(buffer, 0, number);
}

socketOutputStream.close();
fileInputStream.close();
这是我用来在另一台机器上接收文件的:

byte[] buffer = new byte[65536];

InputStream socketStream= clientSocket.getInputStream();
File f=new File("C:\\output.dat");

OutputStream fileStream=new FileOutputStream(f);

while ((number = socketStream.read(buffer)) != -1) {
    fileStream.write(buffer,0,number);
}

fileStream.close();
socketStream.close();

我认为写文件流占用了大部分时间。任何人都可以为加速这段代码提供建议。

这段代码没有什么明显的错误,除了缺少
结束
语句的
最后


多少数据需要多长时间?
FileOutputStream
不太可能是花费时间的原因-更可能是网络速度慢。您可能会并行地从网络读取数据并写入文件系统,但要做到这一点需要做大量的工作,而且我认为这不太可能带来这么多好处。

您可以尝试在FileOutputStream周围使用BufferedOutputStream。它的效果是块对齐所有磁盘写入,而不考虑从网络读取的数量。我不希望有什么大的不同,但这可能会有点帮助。

我在用FTP传输大文件时也遇到过类似的问题。我意识到使用相同的缓冲区从硬盘读取和写入网络是个问题。文件系统IO喜欢较大的缓冲区,因为硬盘执行所有查找和读取的工作量要小得多。另一方面,网络则倾向于使用较小的缓冲区来优化吞吐量

解决方案是使用大缓冲区从硬盘读取数据,然后将该缓冲区以较小的块写入网络流。


我能够在读取4mb和写入32kb的文件的整个长度上以100%的利用率最大化我的NIC。然后,您可以在服务器上执行镜像版本,方法是一次读取32kb并将其存储在内存中,然后一次将4mb写入硬盘。

您说得对。我能够在1111秒内传输大约1327582120字节。fileOutputStream.read(..)语句总共花费了大约7秒,考虑到文件的大小,这似乎是非常正常的。问题实际上是网络给了我不同的传输速率(我有很多电脑连接到这个网络)。也就是说,该代码是否有改进的余地?:)像IPMSG这样的工具为我提供的一致传输速率比我这里得到的稍好一些,因此我想知道是不是我的错误代码造成了问题。@aneesh:您必须非常仔细地观察网络级别上发生的事情-但我怀疑您需要显著的额外复杂性才能获得轻微的性能提升。话虽如此,1MB/秒的速度似乎并不太快——这是一个什么样的网络?@aneesh:什么样的wifi?如果只是802.11b,8Mbits就相当不错了。如果是G,那就不多了。。。不管怎样,如果专用网络传输工具只做得更好一点,我就不做了。它是G,我不总是能得到1MB/秒的传输速率。有时会降到一半。