Java 客户';s BufferedInputStream.read(),而循环从不停止

Java 客户';s BufferedInputStream.read(),而循环从不停止,java,file-io,file-transfer,Java,File Io,File Transfer,我编辑了代码 class SendFileThread extends Thread { private ServerSocket fileTransferServerSocket; private Socket fileTransferSocket; private BufferedReader requestReader; private PrintWriter requestAnswerer; private BufferedOutputStream

我编辑了代码

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();
    }
}
我正在用java制作文件传输程序

我必须发送21个文件

我的代码在
run()

(它不打印“文件接收完成”)-1) fileWriter.write(数据包); System.out.println(“文件接收完成”); fileWriter.close(); } catch(filenotfounde异常){ e、 printStackTrace(); } 捕获(IOE异常){ e、 printStackTrace(); } } SendEndMsg(); CloseTransferStream(); } } 这一错误困扰了我5天:(


有人能帮我避免这个错误吗?

关闭套接字的输出流将关闭套接字,为了发送多个文件,您必须做一些更改

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

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

发送文件(…)
method您正在关闭
fileWriter
,它关闭套接字的输出流,并且无法重新打开。但是如果我在
run()之前设置
fileWriter
,并在
CloseTransferStream()关闭它
,客户端的while循环从未停止。@titusy您是对的,要发送多个文件,您必须先发送文件大小,然后从输入流中读取那么多字节到文件中。