2014-10-28 53 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

關閉套接字的輸出流將關閉套接字,爲了發送多個文件,您將必須進行一些更改。

服務器: 在開始發送文件之前,請發送該文件的長度。

客戶端: 收到文件長度後,開始從輸入流中讀取很多字節並將它們保存到文件中,然後讀取下一個文件的長度。