我有一个应用程序,它使用简单的套接字在两个系统之间传递一些字符.我把我的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中维护此连接?
另一种选择是为自己创建一个 NoCloseInputStream 和 NoCloseOutputStream 过滤器,它们在关闭时什么都不做;然后使用它们来包装应用程序套接字的流(在任何应用程序包装如缓冲区之前)。
请注意,如果要执行此操作,则需要保留对套接字(或包装的流)的引用,以便在实际使用完套接字后可以关闭该套接字。
回答“对于 OP 来说这是一个太高级的概念”的评论:OP 的问题是,在关闭顶级流的同时,他也在关闭底层套接字,但这不好,因为他想创建进一步的顶级流通过套接字发送更多消息。根据他的架构,实现这一点的唯一方法可能是将流包装在 NoClose 包装器中 - 例如,他可能将流传递给 XML 序列化器或反序列化器,该序列化器或反序列化器在完成时关闭流,而哪个关闭在他的控制之外.