2017-09-15 68 views
1

我在寫一個程序,它有一個客戶端和服務器,客戶端將發送一個img文件到服務器。下面的代碼是針對服務器的,它將在obIn.read最後一次運行時阻塞在while循環中,因此它永遠不會返回-1並打破循環。它確實打破了我的客戶端循環。所以我試圖在客戶端循環之後刷新它,但它似乎沒有任何好處。我不想關閉obOut,因爲那樣會關閉我想保持打開的套接字。服務器端是它從obIn(輸入流是一個實例變量)接收咬入的位置,並將其寫入到我創建的文件中。服務器和客戶端發送文件Java

    //server receives file 
        File file = new File("image/image.png"); 
        BufferedOutputStream fileOut = new BufferedOutputStream(new FileOutputStream(file)); 
        byte[] bytes = new byte[1000]; 
        int c = 0; 
        while((c = obIn.read(bytes)) != -1) { 
         fileOut.write(bytes, 0, c); 
         fileOut.flush(); 
         System.out.println(c); 
        } 
        System.out.println(c); 
        fileOut.close(); 
        System.out.println("File Created"); 

   //Client 
       String imgPath = in.nextLine(); 
       File file = new File(imgPath); 

       BufferedInputStream fileIn = new BufferedInputStream(new FileInputStream(file)); 
       byte[] bytes = new byte[1000]; 
       int c = 0; 
       while((c = fileIn.read(bytes)) != -1) { 
        obOut.write(bytes, 0, c); 
        obOut.flush(); 
        System.out.println(c); 
       } 
       obOut.write(bytes, 0, 1000); 
       obOut.flush(); 
       System.out.println(c); 
       fileIn.close(); 
       System.out.println("File Sent"); 

此圖片的輸出,其中所述服務器是在頂部和客戶端是上底部。那是我發現服務器卡住阻塞的地方。

enter image description here

Here是我發現這個方法,並試圖使其成爲我的設置工作。這是我第一次使用流。

+1

更換writeflush功能的同時循環的一面派'-1'您需要關閉()作家(這裏'obOut')。如果你不想這麼做,可以說你想發送很多文件,那麼你需要創建自己的*協議*(客戶端和服務器之間的通話規則)。這樣的協議應該說明,首先你要通知服務器它應該有多少字節(文件的長度),然後而不是等待-1,你只需要計算到達多少字節,並在收到所有字節後服務器可以做其他事情,或者等待它應該處理的其他任務的信息(如接收另一個文件)。 – Pshemo

回答

0

在您的客戶端類的嘗試obOut.close();

相關問題