我有一个应用程序,它使用简单的套接字在两个系统之间传递一些字符。我把我的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?
我满满的吗?如何在Java中维护此连接?
答案 0 :(得分:16)
是的,关闭任何Writer / Reader将关闭它们包装的所有其他Writer和Readers。在准备好关闭底层套接字之前,请不要关闭它。
答案 1 :(得分:9)
作为@Eddie said(在我之前的几秒!:)),关闭编写器和/或读取器将关闭底层套接字流and the socket itself:但是,我相信套接字本身将不会被关闭。
关闭返回的InputStream将关闭相关的套接字。
你不应该关闭作家和读者。只需刷新编写器,确保您的邮件及时到达。稍后关闭套接字将关闭相应的流,因此您无需自己关闭它们。只需将读取器/写入器对象留给GC。
答案 2 :(得分:4)
另一种方法是创建一个NoCloseInputStream和NoCloseOutputStream过滤器,它们在关闭时什么都不做;然后使用它们来包装应用程序套接字的流(在任何应用程序包装之前像缓冲区一样)。
请注意,如果您要执行此操作,则需要保留对套接字(或包装的流)的引用,以便在实际完成套接字时关闭套接字。
回答评论这是“OP的概念太先进了”:OP的问题是,在关闭顶级流时,他也在关闭底层套接字,但这并不好,因为他想进一步创建套接字上的顶级流以发送更多消息。根据他的体系结构,实现这一目标的唯一方法可能是将流包装在NoClose包装器中 - 例如,他可能将流传递给XML序列化器或反序列化器,它在完成后关闭流,这个流在他的控制范围之外
答案 3 :(得分:2)
关闭流后需要关闭套接字。