用于大型文件的Java套接字编程缓冲区

时间:2014-04-24 09:01:10

标签: java sockets buffer

我正在尝试将大文件从服务器传输到客户端。到目前为止我的代码工作,但只有当我将客户端代码中的缓冲区大小设置为文件的确切大小时。我不会总是知道文件大小是多少。我一直在寻找一些例子,声称文件或缓冲区的大小并不重要,因为它只会继续读取输入流...?但是,当我实现应该执行此操作的代码时,它会传输0个字节。

客户端:

public static void main (String [] args ) throws IOException {
    int bytesRead;
    int current = 0;
    FileOutputStream fos = null;
    BufferedOutputStream bos = null;
    Socket sock = null;
    try {
    sock = new Socket(hostname, 20000);
    System.out.println("Connecting...");

    // receive file
    InputStream is = sock.getInputStream();
    fos = new FileOutputStream(FILE_TO_RECEIVE);
    bos = new BufferedOutputStream(fos);
    //////////// replaced this ////////////////////////////
    byte[] buffer  = new byte[BUFFER_SIZE];
    bytesRead = is.read(buffer,0,buffer.length);
    current = bytesRead;
    do {
       bytesRead = is.read(buffer, current, (buffer.length-current));
       if(bytesRead >= 0){ current += bytesRead;}
    } while(bytesRead > 0);
    bos.write(buffer, 0 , current);
    ///////////////////////////////////////

    // with this:
    //        int count;
    //        byte[] buffer = new byte[8192];
    //        while ((count = is.read(buffer)) > 0)
    //        {
    //          bos.write(buffer, 0, count);
    //        }
    //////////// transfers 0 bytes ///////////

    bos.flush();
    System.out.println("File " + FILE_TO_RECEIVE
        + " downloaded (" + current + " bytes read)");
  }
  finally {
    if (fos != null){ fos.close();}
    if (bos != null){ bos.close();}
    if (sock != null){ sock.close();}
  }
}

服务器:

public static void main(String[] args) throws IOException{
    FileInputStream fis = null;
    BufferedInputStream bis = null;
    OutputStream os = null;
    ServerSocket servsock = null;
    Socket sock = null;
    try {

        servsock = new ServerSocket(20000);
        while (true) {
            System.out.println("Waiting...");
            try {
                sock = servsock.accept();
                System.out.println("Accepted connection : " + sock);
                // send file
                File myFile = new File (FILE_TO_SEND);
                byte [] mybytearray  = new byte [(int)myFile.length()];
                fis = new FileInputStream(myFile);
                bis = new BufferedInputStream(fis);
                bis.read(mybytearray,0,mybytearray.length);
                os = sock.getOutputStream();
                System.out.println("Sending " + FILE_TO_SEND + "(" + mybytearray.length + " bytes)");
                os.write(mybytearray,0,mybytearray.length);
                os.flush();
                System.out.println("Done.");
            }
            finally {
                if (bis != null){ bis.close();}
                if (os != null){ os.close();}
                if (sock!=null){ sock.close();}
            }
        }
    }
    finally {
        if (servsock != null){ 
            servsock.close();
        }
    }
}

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

你的副本循环是不同的,都是胡说八道。其中一个甚至不是循环。试试这个:

while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}

这适用于任何大小为> =一个字节的缓冲区。

两端都使用此功能。