[英]Behavior of Java sockets when closing output stream
有人可以解釋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
,它將關閉相關的套接字。
這可能是因為調用PrintWriter
的close()
方法正在追溯層次結構並調用SocketOutputStream
的close()
方法。 作為SocketOutputStream
的close()
方法的SocketOutputStream
它也為Socket
調用close()
方法,這也將關閉SocketInputStream
。 調用shutdownOutput()
函數會發送任何先前寫入的數據,然后發送TCP的正常連接終止序列。 然后它禁用輸出流。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.