客户端 - 服务器不发送整个文件

时间:2014-10-14 13:52:34

标签: java file client

当我运行我的客户端服务器 - 这是连接并且我尝试发送文件时它不会发送整个文件,这会将错误拉到其他地方,它会在中途停止并不断停在相同的部分。这个设置在同一台机器上运行服务器客户端时起作用,所以我很困惑

服务器--->

    // output (a DataOutputstream) is set up elsewhere and messages are sent and received properly
    output.writeInt((int)file.length());
    // send file

    byte [] mybytearray  = new byte [(int)file.length()];
    FileInputStream fis = new FileInputStream(file);
    BufferedInputStream bis = new BufferedInputStream(fis);
    bis.read(mybytearray,0,mybytearray.length);
    System.out.println("Sending " + file + "(" + mybytearray.length + " bytes)");
    output.write(mybytearray,0,mybytearray.length);
    output.flush();
    System.out.println("Done."); 

客户--->

            // input (a DataInputstream) is set up elsewhere and messages are sent and received properly
            String FILE_TO_RECEIVED = "Load_From.xml";
            File file = new File(FILE_TO_RECEIVED);

            int FILE_SIZE = input.readInt();
            if(FILE_SIZE!=0){
                // receive file
                System.out.println("received file size : " + FILE_SIZE);
                byte [] mybytearray  = new byte [FILE_SIZE];
                FileOutputStream fos = new FileOutputStream(file);
                BufferedOutputStream bos = new BufferedOutputStream(fos);
                int bytesRead = input.read(mybytearray, 0, mybytearray.length);
                bos.write(mybytearray, 0, bytesRead);

2 个答案:

答案 0 :(得分:2)

在读取文件和读取套接字时,您只读取部分数据。 read方法返回读取的字节数,您需要一个循环来读取所有内容。例如,

int read = 0, offset = 0;
while ((read = bis.read(mybytearray, offset, mybytearray.length - offset) != -1) {
    offset += read;
}

或者您可以使用标准库中的类,例如DataInputStreamreadFully方法。

DataInputStream dis = new DataInputStream(fis);
dis.readFully(mybytearray);

答案 1 :(得分:2)

请参阅read()的文档:http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#read(byte[],%20int,%20int)

特别是:

  

尝试读取len个字节,但可以读取较小的数字。实际读取的字节数以整数形式返回。

这意味着如果返回的长度不是您所期望的并且您还没有遇到文件结束,则应该再次调用read()(在循环中)。