2012-05-25 46 views
1

我有一個BufferedOutputStream問題。我想通過套接字連接從Android設備發送一個kml文件到一個java服務器。 (連接是好的,我已經能夠與我的程序的其他部分的PrintWriter交換數據)Android - BufferedOutputStream不刷新

要發送我的kml文件,我填充緩衝區。但是當我沖洗()它時,什麼也沒有發生。

 int lu = inFile.read(); 
     while(lu != -1){ 
      out.write(lu); 
      lu = inFile.read(); 
     } 
     out.flush(); 
     inFile.close(); 

INFILE是用來讀取KML文件我流 出來是用我的插座的OutputStream我的BufferedOutputStream

我不收我的了對象,但我不想,我不不要只用一次。這就是問題所在...... close()方法發送緩衝區的數據,但也關閉套接字。 flush()方法不會發送緩衝區的數據。

我想刷新緩衝區而不關閉套接字。

我也嘗試使用mySocket.shutdownOutput();

 int lu = inFile.read(); 
     while(lu != -1){ 
      out.write(lu); 
      lu = inFile.read(); 
     } 
     out.flush(); 
     mySocket.shutdownOutput(); 
     inFile.close(); 

此方法關閉我的流並保持我的套接字打開,這就是我想要的。 但是,當我嘗試打開一個新的輸出流,異常java.net.SocketException:套接字輸出已關閉

因此,如何刷新我的緩衝區而不關閉我的sokcet正在無法打開新的輸出流?

+0

哪種類型的OutputStream是BufferedOutputStream的基礎? – vaughandroid

+0

從具有s.getOutputStream()的套接字獲取的outputStream。 – ZarkDev

+0

我想你需要仔細看看服務器端實際發生了什麼。你可以發佈那麼做的代碼嗎?我有一種感覺@ EJP的答案是在正確的軌道上... – vaughandroid

回答

3

Socket.close()Socket.shutdownOutput()都發送一個EOS到對方,在這個對話上他應該關閉套接字,然後你不能再寫入套接字,因爲你已經關閉了它。

所以,如果你需要繼續寫入套接字,你不能使用這些方法。

可能您正在搜索的是劃分應用程序協議消息的方式。至少有三種技術:

  1. 在每封郵件之前發送一個長度單詞。
  2. 在每個消息後發送一個帶外分隔符,即消息中不能出現的字節或字節序列。帶有轉義的STX/ETX協議就是一個例子。
  3. 使用自描述消息格式,如對象序列化或XML。 STX/ETX也是這方面的一個例子。
+0

我的協議如下: Android發送「kml_itineraire \ n」,服務器回答ACK。 然後,我發送我的問題中提出的文件。一旦接收完成,服務器會向Android發送另一條特定消息。 我發現了另一個解決方案,獲取文件內容在一個字符串中,並用PrintWriter.println()寫入它。Java使用readLine()接收此String。這種解決方案的工作原理,但我希望使用二進制傳輸... (對不起,我的英文,我fernch:s) – ZarkDev

+0

@ Zarkaos正是如此。換行符是一個帶外分隔符的例子。例如,您也可以使用DataOutputStream.writeUTF()和DataInputStream.readUTF()。 – EJP