2014-10-28 48 views
0

我编辑的代码客户的BufferedInputStream.read()while循环永远不会停止

我做的文件传输程序用java

我要送21页的文件。

我的代码在run()

停在客户的while循环(这不打印“文件接收完毕” < - 见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(); 
    } 
} 

Cl ient的CODE

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天即这个错误困扰我:(

谁能救我脱离这个错误?

+0

在您的'SendFile(...)'方法中,您正在关闭'fileWriter',它将关闭套接字的输出流并且无法重新打开。 – Titus 2014-10-28 05:45:58

+0

但是,如果我在'run()'之前创建'fileWriter',并在'CloseTransferStream()'关闭它,** Client **的while循环不会停止。 @Titus – 2014-10-28 05:50:55

+0

是的你是对的,为了发送多个文件,你必须先发送文件的大小,然后从输入流中读取很多字节到一个文件中。 – Titus 2014-10-28 06:03:52

回答

1

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

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

客户端: 收到文件长度后,开始从输入流中读取很多字节并将它们保存到文件中,然后读取下一个文件的长度。