2011-10-07 36 views
0

我想寫一個接受文件並使用DataInputStream和BufferedInputStream將其寫入特定目錄中的服務器。 (字符串)「'文件數量(int)''文件名稱(字符串)''每個文件的長度(長)'和'未解釋字節的文件內容(byte [ ])'java網絡編程,試圖寫一個服務器,但不工作

如果一切都成功了,那麼我應該發送布爾值。

但問題是它沒有正確接收文件。

我不時收到'broken pipe'錯誤消息或文件損壞。

我看着我的代碼4小時,並找不到問題。

你能幫我解答嗎? 你可以假設客戶端工作正常。

回答

2

首先,您不必關閉所有這些流。這可能就是你看到破管問題的原因。您只需關閉輸入和輸出流。

DataInputStream din = new DataInputStream(new BufferedInputStream(socket.getInputStream())); 
DataOutputStream dout = new DateOutputStream(new BufferedOutputStream(socket.getOutputStream()); 
try { 


} finally { 
    din.close(); 
    dout.close(); 
} 

您不必關閉所有這些流的原因是因爲你的緩衝*流和插座的InputStream/OutStream將DIN/dout.close()被調用時關閉。那些將通過它們鏈接的參考來關閉流。如果(blah!= null)每個都是垃圾,那麼你也可以去掉所有的垃圾,因爲如果你把它放到finally子句中,你知道它們是非空的。如果你在嘗試中沒有新的話,你就會知道這種情況。

你也在泄漏你的FileOutputStream,因爲你用第二個新的FileOutputStream()覆蓋了fos變量。你在那裏用SUBMIT_DONE文件做什麼?這真的很奇怪。這樣做非常糟糕。不要像這樣兩次使用變量引用。我可能會在循環之後關閉第一個文件。想想用{{finally} {fos.close();}來包裝那個循環。 }。

而且你可能會嘗試使用方法來解決這個問題。拋開靜態。

更新:

正是你認爲以下是幹什麼的?

while(c!='\0') { 
    userName += c; 
    c = din.readChar(); 
} 

取決於你是如何從客戶端或服務器發送數據時,你可以只使用:

String userName = din.readUTF(); 

記住你正在處理格式的二進制數據DataInputStream類。對於文件名,您也可以重複該確切的循環代碼。如果你不能使用readUTF(),那麼創建一個包裝該循環並返回一個字符串並從這兩個地方調用它的方法。您有各種安全問題,允許客戶將原始文件名和文件上傳給您。我希望可愛的寶貝jeez你正在構建的這臺服務器沒有被部署到生產環境中。

您還需要刷新並關閉通過套接字接收的每個文件,以使發送的全部數據完全寫入文件。

+0

但是,當我做你的代碼後,我仍然斷了管道。不知道問題是什麼 –

+0

您可能需要重新發布已更改的代碼,以便在代碼中發生異常。檢查異常,它會顯示出例外的文件的行號。如果您在理解例外時遇到問題,請發送完整例外,我可以指出。更新你原來的問題,因爲它在評論中沒有足夠的空間。 – chubbsondubs

+0

我修好了,謝謝你的幫助! –

相關問題