0
我正在做一個服務器與Java和客戶端與Android。一切工作正常,但是當我嘗試在Android上接收文件時,IO輸入凍結。我試圖用Java測試應用程序來做同樣的事情,並且工作正常。Socket上的Java與WiFifreezing發送文件
我的客戶端代碼:
int bytesRead;
long current = 0;
byte [] mybytearray = new byte[InfoPrograma.BUFFER_LENGTH];
//Receive file
InputStream is = socket.getInputStream();
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(file)
);
while (
(bytesRead = is.read(
mybytearray,
0,
mybytearray.length
)
) >= 0) {
current += bytesRead;
bos.write(mybytearray, 0 , bytesRead);
}
bos.flush();
bos.close();
服務器端代碼:
File file = new File(fileStr);
byte[] buffer = new byte[InfoPrograma.BUFFER_LENGTH];
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream(file)
);
OutputStream os = socket.getOutputStream();
long tmp = 0;
while ((count = bis.read(buffer)) > 0) {
os.write(buffer, 0, count);
tmp += count;
System.out.println(tmp);
}
os.flush();
BUFFER_LENGHT是2000。如果你有什麼需要,提出要求,請。
謝謝。
當發送文件完成後,套接字是否在服務器端關閉?如果連接保持打開狀態,則客戶端的讀取可能不像您期望的那樣運行。你知道,如果你在read()或者while()中使用bytesRead爲0來阻塞? – ribram
服務器上的套接字未關閉。即使我刪除了超時設置。我在debuugging上再次看到它,它似乎完全接收文件,但是當進行最後一次讀取時,當沒有字節可以接收時,它會被阻塞。如何防止它做到這一點? – elxordi
我不確定是否關閉輸出流會做到這一點,但如果沒有,則顯式關閉()爲套接字。關閉服務器端的套接字應導致客戶端讀取返回0.您應該將客戶端的讀取檢查更改爲循環,而讀取> 0並將其解釋爲0表示「套接字已關閉,文件結束」。 – ribram