簡體   English   中英

關閉輸出流時Java套接字的行為

[英]Behavior of Java sockets when closing output stream

有人可以解釋Java套接字中的以下行為:

一般的想法是這樣的:

  1. 打開套接字,獲取I / O流。
  2. 寫請求,關閉流
  3. 讀取響應,在流中關閉
  4. 關閉插座。

這是我的問題/問題。

如果我使用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 ,它將關閉相關的套接字。

這可能是因為調用PrintWriterclose()方法正在追溯層次結構並調用SocketOutputStreamclose()方法。 作為SocketOutputStreamclose()方法的SocketOutputStream它也為Socket調用close()方法,這也將關閉SocketInputStream 調用shutdownOutput()函數會發送任何先前寫入的數據,然后發送TCP的正常連接終止序列。 然后它禁用輸出流。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM