Java 如何通过socket服务器应用程序提高上传/下载速度?

Java 如何通过socket服务器应用程序提高上传/下载速度?,java,sockets,stream,network-programming,Java,Sockets,Stream,Network Programming,我正在尝试将一个大文件从我的计算机上载到另一个网络中的另一台计算机。但是,文件传输速度非常慢。是什么导致我的代码出现瓶颈 以下代码用于上传程序: public static void main(String [] args) throws IOException { /* * Take a file, read it into a byte array using the File Input Stream * Then send that byte array us

我正在尝试将一个大文件从我的计算机上载到另一个网络中的另一台计算机。但是,文件传输速度非常慢。是什么导致我的代码出现瓶颈

以下代码用于上传程序:

public static void main(String [] args) throws IOException {
    /*
     * Take a file, read it into a byte array using the File Input Stream
     * Then send that byte array using a Buffered Output Stream
     * Done
     */
    ServerSocket serverSocket = new ServerSocket(port);
    Socket clientSocket = serverSocket.accept();
    BufferedOutputStream bos = new BufferedOutputStream(clientSocket.getOutputStream());
    
    File file = new File(fileToSend);
    FileInputStream fis = new FileInputStream(file);
    byte[] byteArray = fis.readAllBytes();
    bos.write(byteArray);
    bos.flush();
    bos.close();
}
下面是我用来下载文件的内容:

public static void main(String[] args) throws UnknownHostException, IOException {
    /*
     * Open up a socket, then get the byte array using a buffered input stream
     * then use a file output stream to write out the file
     */
    long start = System.currentTimeMillis();
    Socket socket = new Socket(hostName, port);
    BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
    byte[] byteArray = bis.readAllBytes();
    FileOutputStream fos = new FileOutputStream(fileOutput);
    fos.write(byteArray);
    long end = System.currentTimeMillis();
    System.out.println("Download time: " + (end - start)/1000);
}

所谓慢,我的意思是通过这个程序上传一个100MB的文件需要6-7分钟,而在谷歌硬盘上上传只需要一分钟。我仍在尝试学习套接字服务器编程,因此请务必让我知道瓶颈在哪里。

您正在通过以下方式一次读取RAM中的所有字节:

byte[] byteArray = fis.readAllBytes();
然后,将所有字节写入套接字:

bos.write(byteArray);
因此,您必须等待从文件系统加载所有100MB,然后再等待发送这些字节。在下载程序中,你可以用另一种方式来做

您可以通过将这两个作业拆分为单独的线程来减少此时间

  • 第一个线程不断地从FS中读取n个字节(比如1024个字节),并将其存储在shared synchronizedList中
  • 第二个线程从列表中读取n个字节并将其写入客户端
这些线程还可以与PipedInputStream和PipedOutStream相互通信:

此外,您还可以使用压缩流,如GZIP:

您应该考虑使用(自动)R(esource)M(管理)博客

谷歌服务器的网络路径与你的服务器的网络路径不同,这可能是部分或全部速度差异的原因。通过使用类中的
copy()
方法,可以简化并可能加快传输。