1

我有一个通过服务器套接字将文件发送到服务器的代码。我的问题是,对于某些文件,代码可以完美运行,但由于某些其他文件的未知原因,它会丢失最后一个块,因此文件已损坏。

我将不胜感激任何人的帮助。谢谢你。

客户端代码。

@Override
public void run(){


    for (File file: sendingFiles){

        try{
            socket=new Socket(host, port);
            out=new BufferedOutputStream(socket.getOutputStream());

            fileIn=new FileInputStream(file);

            byte[] buf=new byte[40*1024];

            int readByte;

            while((readByte=fileIn.read(buf, 0, buf.length))>0){                  

                out.write(buf, 0, readByte);                    

            }

            System.out.println("client out of loop");

            fileIn.close();
            in.close();
            out.close();
            socket.close();

            cancel=false;                

        }catch (IOException e){
            e.printStackTrace();
            this.finish();

        }catch (Exception e){
            e.printStackTrace();
            this.finish();
        }
    }

    this.finish();

}

服务器代码:

@Override
public void run(){

    try{
        in=new BufferedInputStream(socket.getInputStream());
        out=new PrintWriter(socket.getOutputStream(), true);

        fileOut=new BufferedOutputStream(new FileOutputStream(receivingFile));

        byte[] buf=new byte[40*1024];

        out.println("continue");

        int readByte=0;
        while ((readByte=in.read(buf, 0, buf.length))>0){

            fileOut.write(buf, 0, readByte);

        }

        this.finish();

    }catch (IOException e){
        this.finish();
    }catch (Exception e){
        this.finish();
    }
}

以及刷新和关闭流的完成方法

 private void finish(){

    if (fileOut!=null){
        try{
            fileOut.flush();
            fileOut.close();
        }catch (IOException e){}
    }
    if (socket!=null){
        try{
            socket.close();
        }catch (IOException e){}
    }

    if (in!=null){
        try{
            in.close();
        }catch (IOException e){}
    }

    if (out!=null){            
        out.close();            
    }
}

请帮我。我找不到错误在哪里!!!!

解决了。我只是把输出冲洗到循环中,它工作得很好。

非常感谢我的朋友们。

4

2 回答 2

1

您应该尝试刷新 BufferedOutputStreams:

http://docs.oracle.com/javase/7/docs/api/java/io/BufferedOutputStream.html#flush()

于 2013-07-13T15:53:40.097 回答
0

关闭 fileOut BufferedOutputStream。关闭它,它会将缓冲区刷新到磁盘并关闭流。

于 2013-07-13T15:50:27.000 回答