关闭BufferedReader/PrintWriter会关闭套接字连接吗?

Ale*_*lex 16 java sockets

我有一个应用程序,它使用简单的套接字在两个系统之间传递一些字符.我把我的java应用程序作为服务器运行.我建立一个连接很好,甚至传递一个消息.但是,在发送一条消息后,我的连接关闭.

从我可以看出它似乎在关闭时printWriter,bufferedReader套接字本身正在关闭?!这很糟糕,因为我有多条消息要在同一个连接上发送.

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?
Run Code Online (Sandbox Code Playgroud)

我满满的吗?如何在Java中维护此连接?

Edd*_*die 16

是的,关闭任何Writer/Reader将关闭他们包装的所有其他作家和读者.在准备好关闭底层套接字之前,请勿关闭它.


Hos*_*Aly 9

正如@Eddie 所说(在我之前几秒!)),关闭编写器和/或读取器将关闭底层套接字流和套接字本身:但是,我相信套接字本身不会被关闭.

关闭返回的InputStream将关闭关联的套接字.

你不应该关闭作家和读者.只需刷新编写器,确保您的邮件及时到达.稍后关闭套接字将关闭相应的流,因此您无需自己关闭它们.只需将读取器/写入器对象留给GC即可.


Law*_*Dol 5

另一种选择是为自己创建一个 NoCloseInputStream 和 NoCloseOutputStream 过滤器,它们在关闭时什么都不做;然后使用它们来包装应用程序套接字的流(在任何应用程序包装如缓冲区之前)。

请注意,如果要执行此操作,则需要保留对套接字(或包装的流)的引用,以便在实际使用完套接字后可以关闭该套接字。

回答“对于 OP 来说这是一个太高级的概念”的评论:OP 的问题是,在关闭顶级流的同时,他也在关闭底层套接字,但这不好,因为他想创建进一步的顶级流通过套接字发送更多消息。根据他的架构,实现这一点的唯一方法可能是将流包装在 NoClose 包装器中 - 例如,他可能将流传递给 XML 序列化器或反序列化器,该序列化器或反序列化器在完成时关闭流,而哪个关闭在他的控制之外.