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");
此圖片的輸出,其中所述服務器是在頂部和客戶端是上底部。那是我發現服務器卡住阻塞的地方。
Here是我發現這個方法,並試圖使其成爲我的設置工作。這是我第一次使用流。
更換
write
和flush
功能的同時循環的一面派'-1'您需要關閉()作家(這裏'obOut')。如果你不想這麼做,可以說你想發送很多文件,那麼你需要創建自己的*協議*(客戶端和服務器之間的通話規則)。這樣的協議應該說明,首先你要通知服務器它應該有多少字節(文件的長度),然後而不是等待-1,你只需要計算到達多少字節,並在收到所有字節後服務器可以做其他事情,或者等待它應該處理的其他任務的信息(如接收另一個文件)。 – Pshemo