2011-06-29 37 views
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。如果你有什麼需要,提出要求,請。

謝謝。

+0

當發送文件完成後,套接字是否在服務器端關閉?如果連接保持打開狀態,則客戶端的讀取可能不像您期望的那樣運行。你知道,如果你在read()或者while()中使用bytesRead爲0來阻塞? – ribram

+0

服務器上的套接字未關閉。即使我刪除了超時設置。我在debuugging上再次看到它,它似乎完全接收文件,但是當進行最後一次讀取時,當沒有字節可以接收時,它會被阻塞。如何防止它做到這一點? – elxordi

+0

我不確定是否關閉輸出流會做到這一點,但如果沒有,則顯式關閉()爲套接字。關閉服務器端的套接字應導致客戶端讀取返回0.您應該將客戶端的讀取檢查更改爲循環,而讀取> 0並將其解釋爲0表示「套接字已關閉,文件結束」。 – ribram

回答

0

完成它。我發現的唯一方法是首先發送文件的長度到客戶端,保存它,然後執行read()while(在我的代碼上)當前的< fileLength。