有人可以解釋以下行爲的Java插座:行爲的Java插座時,請關閉輸出流
的總體思路是這樣的:
- 打開插座,獲得I/O流。
- 寫請求,收出流
- 讀取響應,在流
- 關閉插座關閉。
這是我的問題。
如果我使用PrintWriter
進行輸出,然後關閉它,它會關閉整個套接字,並且隨後的讀取操作會失敗。
相反,如果我直接使用套接字的shutdownOutput()
方法,它會正確關閉輸出流通道,同時保持套接字活動。
爲什麼要關閉PrintWriter
對象將整個套接字放在一起呢?
有人可以解釋以下行爲的Java插座:行爲的Java插座時,請關閉輸出流
的總體思路是這樣的:
這是我的問題。
如果我使用PrintWriter
進行輸出,然後關閉它,它會關閉整個套接字,並且隨後的讀取操作會失敗。
相反,如果我直接使用套接字的shutdownOutput()
方法,它會正確關閉輸出流通道,同時保持套接字活動。
爲什麼要關閉PrintWriter
對象將整個套接字放在一起呢?
這可能是你的代碼是什麼樣子:
Socket socket;
PrintWriter pw = new PrintWriter(socket.getOutputStream());
pw.close();
現在,讓我們來看看的Socket getOutputStream()
方法的說明。
getOutputStream
public OutputStream getOutputStream() throws IOException
返回此套接字的輸出流。 如果此套接字具有關聯的通道,則生成的輸出流會將其所有操作委託給該通道。如果通道處於非阻塞模式,則輸出流的寫入操作將拋出一個
IllegalBlockingModeException
。關閉返回的
OutputStream
將關閉關聯的套接字。返回:
的字節寫入此套接字的輸出流。
拋出:
IOException - 如果創建輸出流或如果套接字未連接時發生I/O錯誤。
從上面的描述中,我們知道關閉返回的OutputStream
會關閉相關的套接字。
現在,當你關閉PrintWriter
,它會關閉相關OutputStream
將關閉關聯套接字。
RTFM eh? :) 我想這可以徹底解釋它。謝謝血狼! – 2012-01-17 14:49:26
@Alanmars如何避免這種情況。如果我想在關閉OutputStream後仍保持打開狀態,該怎麼辦?有沒有辦法做到這一點? – 2016-06-13 10:08:21
這可能是因爲調用的PrintWriter
的close()
方法追溯通過等級和調用SocketOutputStream
的close()
方法爲好。作爲SocketOutputStream
的close()
方法的一部分,它也調用Socket
的close()
方法,這也將在短期內關閉SocketInputStream
。調用shutdownOutput()
函數會發送之前寫入的數據,然後是TCP的正常連接終止序列。然後禁用輸出流。
也許你需要在關閉之前刷新它。 – 2012-01-17 05:59:05
你試圖關閉您的PrintWriter,看看問題是否犯規發生之前,您連接.flush()沖洗? – vcetinick 2012-01-17 05:59:26