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

我有一个应用程序,它使用简单的套接字在两个系统之间传递一些字符。 我把我的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和NoCloseOutputStreamfilter,它们在关闭时什么都不做; 然后使用它们来包装应用程序套接字的流(在任何应用程序包装之前像缓冲区一样)。

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

回答这个问题是“对于OP来说太过先进了”:OP的问题在于关闭顶级流,他也在关闭底层套接字,但这并不好,因为他想要创建更高级别的顶层流过套接字以发送更多消息。 根据他的体系结构,实现这一目标的唯一方法可能是将流包装在NoClose包装器中 – 例如,他可能将流传递给XML序列化器或反序列化器,它在完成时关闭流,该关闭超出了他的控制范围。 。

关闭流后需要关闭套接字。