簡體   English   中英

關閉BufferedReader / PrintWriter會關閉套接字連接嗎?

[英]Does closing the BufferedReader/PrintWriter close the socket connection?

我有一個應用程序,它使用簡單的套接字在兩個系統之間傳遞一些字符。 我把我的java應用程序作為服務器運行。 我建立一個連接很好,甚至傳遞一個消息。 但是,在發送一條消息后,我的連接關閉。

從我可以告訴它看起來好像在關閉printWriterbufferedReader ,套接字本身正在關閉?! 這很糟糕,因為我有多條消息要在同一個連接上發送。

printWriter = new PrintWriter(theServer.getClientSocket().getOutputStream());
bufferedReader = new BufferedReader(new InputStreamReader(theServer.getClientSocket().getInputStream()));


printWriter.println("the line");

printWriter.close(); //Closing on these lines?
bufferedReader.close(); //Closing on these lines?

我滿滿的嗎? 如何在Java中維護此連接?

是的,關閉任何Writer / Reader將關閉他們包裝的所有其他作家和讀者。 在准備好關閉底層套接字之前,請勿關閉它。

正如@Eddie 所說 (在我之前幾秒!)),關閉編寫器和/或讀取器將關閉底層套接字流和套接字本身 但是,我相信套接字本身不會被關閉

關閉返回的InputStream將關閉關聯的套接字。

你不應該關閉作家和讀者。 只需刷新編寫器,確保您的郵件及時到達。 稍后關閉套接字將關閉相應的流,因此您無需自己關閉它們。 只需將讀取器/寫入器對象留給GC即可。

另一種方法是創建一個NoCloseInputStream和NoCloseOutputStream過濾器,它們在關閉時什么都不做; 然后使用它們來包裝應用程序套接字的流(在任何應用程序包裝之前像緩沖區一樣)。

請注意,如果您要執行此操作,則需要保留對套接字(或包裝的流)的引用,以便在實際完成套接字時可以關閉套接字。

回答這個問題是“對OP來說太過先進了”:OP的問題在於關閉頂級流,他也在關閉底層套接字,但這並不好,因為他想要創建更高級別的頂層流過套接字以發送更多消息。 根據他的體系結構,實現這一目標的唯一方法可能是將流包裝在NoClose包裝器中 - 例如,他可能將流傳遞給XML序列化器或反序列化器,它在完成后關閉流,這個流在他的控制范圍之外。

關閉流后需要關閉套接字。

暫無
暫無

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

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