客户端的BufferedInputStream.read()while循环永不停止

时间:2014-10-28 05:37:20

标签: java file-io file-transfer

我编辑代码

我正在使用java进行文件传输程序

我必须发送21个文件。

我的代码在run()

循环时停留在客户端

(它不会打印"文件接收完成" < - 请参阅客户端中的run()

服务器代码

class SendFileThread extends Thread {
    private ServerSocket fileTransferServerSocket;
    private Socket fileTransferSocket;
    private BufferedReader requestReader;
    private PrintWriter requestAnswerer;
    private BufferedOutputStream fileWriter;
    private int fileTransferPort = 12345;

    public SendFileThread() {
        try {
            fileTransferServerSocket = new ServerSocket(fileTransferPort);
            fileTransferSocket = fileTransferServerSocket.accept();
            requestReader = new BufferedReader(new InputStreamReader(fileTransferSocket.getInputStream()));
            fileWriter = new BufferedOutputStream(fileTransferSocket.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void CloseTransferStream() {
        try {
            requestAnswerer.close();
            requestReader.close();
            fileWriter.close();
            fileTransferSocket.close();
            fileTransferServerSocket.close();
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

    public void SendFile(String filename) {
        try {
            File file = new File(CLIENT_PATH + "/" + filename);
            BufferedInputStream fileReader = new BufferedInputStream(new FileInputStream(file));

            int packet;

            while((packet = fileReader.read()) != -1)
                fileWriter.write(packet);

            fileWriter.flush();
            fileReader.close();
        }
        catch (IOException ioe) {
            System.out.println(ioe.getMessage());
        }

        //System.out.print(filename + " send complete (" + count + " times)");
    }

    public void ListenForRequester() {
        try {
            String input;
            while((input = requestReader.readLine()) != null) {
                if(input.equals("request file")) {
                    SendFile(requestReader.readLine());
                }
                else if(input.equals("end transfer"))
                    break;
                else {
                    System.out.println("Something wrong");
                }
            }
        }
        catch(IOException ioe) {
            ioe.getStackTrace();
        }
    }

    public void run() {
        ListenForRequester();
        CloseTransferStream();
    }
}

客户的代码

class ReceiveFileThread extends Thread {
    private Socket fileTransferSocket;
    private int fileTransferPort = 12345;
    private BufferedInputStream fileReader;
    private PrintWriter fileRequester;

    public ReceiveFileThread() {
        try {
            fileTransferSocket = new Socket(serverIP, fileTransferPort);
            fileRequester = new PrintWriter(fileTransferSocket.getOutputStream(), true);
            fileReader = new BufferedInputStream(fileTransferSocket.getInputStream());
        }
        catch (UnknownHostException e) {
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void CloseTransferStream() {
        try {
            fileRequester.close();
            fileReader.close();
            fileTransferSocket.close();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }

    public synchronized void RequestFile(String filename) {
        fileRequester.println("request file");
        fileRequester.println(filename);    
    }

    public synchronized void SendEndMsg() {
        fileRequester.println("end transfer");
    }

    public void run() {
        for(int i = 0;i < fileList.size();i++) {
            String filename = (String)fileList.get(i);
            RequestFile(filename);

            try {
                BufferedOutputStream fileWriter = new BufferedOutputStream(new FileOutputStream(new File(PROGRAM_PATH + "/" + filename)));

                int packet = 0;

                while((packet = fileReader.read()) > -1)
                    fileWriter.write(packet);

                System.out.println("file receive complete");

                fileWriter.close();
            }
            catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            catch (IOException e) {
                e.printStackTrace();
            }
        }

        SendEndMsg();           
        CloseTransferStream();
    }
}

这个错误让我困扰了5天:(

有人可以免除此错误吗?

1 个答案:

答案 0 :(得分:1)

关闭套接字的输出流将关闭套接字。为了发送多个文件,您将不得不进行一些更改。

服务器: 在开始发送文件之前,请发送该文件的长度。

客户端: 收到文件的长度后,开始读取输入流中的那么多字节并将它们保存到文件中,当你读完下一个文件的长度时。