2012-03-13 106 views
0

這是我的代碼URL連接InputStream和OutputStream對象

URL url = new URL("http://172.16.32.160:8080/epramaan/loginotp"); 
URLConnection connection1 = url.openConnection(); 
connection1.setDoOutput(true); 

ObjectOutputStream out=new ObjectOutputStream(connection1.getOutputStream()); 
out.writeObject(send); 
out.flush(); 
out.close(); 

ObjectInputStream in = new ObjectInputStream(connection1.getInputStream()); 
String output=(String)in.readObject(); 
in.close(); 

//Rest of the code 

一旦OutputStream以便向流寫入數據時,將對象的InputStream停止執行,直到接收到響應?

+1

你應該發送任何數據,保證你會得到你 – 2012-03-13 10:51:51

+1

您使用out.writeObject發送數據之前意味着服務器所需要的一切()我應該初始化對象的inputStream之前打開輸入流?你能否詳細說明 – suraj 2012-03-13 10:57:39

+0

@MichaelLaffargue - 其實我不認爲這是必要的。 HTTP 1.1 RFC說明了這一點 - *「在接收並解釋請求消息後,服務器用HTTP響應消息進行響應。」*。 (第6節)。操作詞是「之後」。在仍然讀取請求的同時開始發送響應的服務器將違反規範。因此,在輸出流關閉之前不需要打開輸入流。 – 2012-03-13 11:37:46

回答

1

我認爲通過停止執行你的意思塊。

只注意到你正在使用readObject而沒有讀取。請詳細說明您正在閱讀/寫入什麼樣的數據,以及爲什麼使用對象流?

正如你所提到的你使用的是字符串,我會建議使用方法readFully(byte[] buf)。該方法阻塞直到讀取所有字節。一旦你有了字節數組,這個字節數組就是String can be created

+0

問題是使用readObject(),而不是read()。 readObject()的API沒有指定阻止 – 2012-03-13 11:02:22

+0

我明白了。我對此進行了編輯。 – Santosh 2012-03-13 11:06:47

+0

@Santosh:我正在使用String數據 – suraj 2012-03-13 11:20:44

1

可以使用InputStream.read(byte[])用於讀取的整個字節數組存儲器(你可以從HTTP Content-Length頭陣列的長度)和定時使用URLConnection.setReadTimeout()出如果正在阻止的時間過長。
從字節數組,你可以構造你的對象,構建您的的ObjectInputStreamByteArrayInputStream的

+0

爲什麼在使用多個輸入輸出對象流時會出現java.io.CorruptedStreamException?我已經關閉了所有對象的InputStream和Object Output Stream,然後在那裏。這個錯誤並不總是發生。它只發生在我第一次點擊按鈕時(按鈕的onClickListener包含發送和接收代碼) – suraj 2012-03-14 07:21:59

+0

你是什麼意思通過「多輸入輸出對象流」?在你的問題中,我沒有在代碼中看到多個實例。 – 2012-03-14 11:22:45

1

一旦OutputStream以便向流寫入數據時,將對象的InputStream停止執行,直到接收到響應?

不準確。打開InputStream不會阻塞任何內容,甚至不會導致發送請求標頭。但是,從InputStream閱讀將做這兩件事情。

我懷疑問題的真正原因是您從服務器獲得的錯誤響應不是序列化對象;例如它可能是來自服務器的通用HTML錯誤頁面。當然,試圖反序列化失敗。

正確的做法是:

  1. 創建URLConnection對象。
  2. 設置您需要的任何請求標頭。
  3. 連接它(或跳過這個......它會隱式發生)。
  4. 打開並寫入OutputStream。
  5. 關閉OutputStream。
  6. 使用getResponseCode()來查看請求是成功還是失敗。
    1. 如果成功,調用getInputStream()並讀取並處理響應。
    2. 如果失敗,請調用getErrorStream()並處理錯誤輸出。
+0

我有和「user1166690」相同的問題。所以我問他問了「Oded peer」的問題。爲什麼在使用多個輸入輸出對象流時得到java.io.CorruptedStreamException?我已經關閉了所有對象的InputStream和Object Output Stream,並且在那裏。這個錯誤並不總是發生。它僅在第一次點擊Button時發生(Button的onClickListener包含發送和接收的代碼) – Ashwin 2012-03-14 07:43:03

相關問題