2012-07-10 95 views
1

我正在嘗試編寫一個非常簡單的應用程序,該應用程序會通過HTTP將PUT請求上傳到我的服務器之一。以下是我的代碼的樣子:嘗試寫入文件時發生斷管異常

socket = new Socket(); 
socket.connect(new InetSocketAddress(ticket.getHost(), 80)); 

outputStream = socket.getOutputStream(); 

// begin forming the request 
outputStream.write(("PUT " + ticket.getEndpoint() + " HTTP/1.1\r\n" + 
     "Host: " + ticket.getHost() + "\r\n" + 
     "Content-Length: " + getStreamFile().length() + "\r\n" + 
     "Content-Type: video/mp4\r\n\r\n").getBytes()); 

// now, let's write us some binary data 
fileInputStream = new FileInputStream(getStreamFile()); 
inputStream = new BufferedInputStream(fileInputStream); 

byte[] fileBytes = new byte[1024]; 
int bytesRead = 0; 
int totalBytesRead = 0; 

while ((bytesRead = inputStream.read(fileBytes)) > 0) { 
    outputStream.write(fileBytes, 0, bytesRead); 

    totalBytesRead += bytesRead; 

    notifyListenersOnProgress((double)totalBytesRead/(double)getStreamFile().length()); 
} 

很簡單吧?直到我看到大約兩個循環後出現這個錯誤:

java.net.SocketException: Broken pipe 
    at java.net.SocketOutputStream.socketWrite0(Native Method) ~[na:1.6.0_23] 
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109) ~[na:1.6.0_23] 
    at java.net.SocketOutputStream.write(SocketOutputStream.java:141) ~[na:1.6.0_23] 

我在做什麼錯在這裏?

回答

0

不要手動做這個東西。爲此使用HttpURLConnection,這就是它的用途。創建一個URL,從中獲取HttpURLConnection,將請求方法設置爲「PUT」,設置內容類型,不要設置內容長度,獲取輸出流並開始寫入。

+0

由於上傳要求,我_要設置內容長度。我能否像正常輸出流一樣寫,這樣我就可以測量上傳進度了嗎? – 2012-07-10 16:08:56

+0

@TKKocheran不,你不知道。 Java將自動設置內容長度。自己設置只會提供一個錯誤的機會。如果這是一個很大的轉移,我會設置分塊傳輸模式。是的,您可以監視輸出流的進度。 – EJP 2012-07-11 00:56:41

0

不知道是否這是問題,但您在video/mp4之後錯過了第二個\r\n

您還應該修改您的write調用,以僅寫入陣列的第一個bytesRead字節。

+0

固定並修復,仍然會損壞管道。 – 2012-07-10 02:07:03

+0

將你的輸出分割成一個文件並檢查它。我喜歡從apache公共版本中使用'TeeOutputStream'。確保你的ticket.getEndpoint()是正確的(例如沒有'http:// host.com'前綴)。 – 2012-07-10 02:18:04

+0

'ticket.getEndpoint()'結果應該是什麼樣子?它應該是完全形成的網址還是網站根目錄的相對網址? – 2012-07-10 16:12:28

0

由於某種原因,套接字的接收端關閉了連接。

+0

你的第一句話是正確的,但其餘的不是。 'Socket.isConnected()'不會檢測到。它不是連接狀態,而是套接字狀態。 – EJP 2012-07-10 02:26:01

+0

對..我會刪除那部分。 – Soronthar 2012-07-10 14:33:29

相關問題