代码之家  ›  专栏  ›  技术社区  ›  Alex

关闭BufferedReader/PrintWriter是否会关闭套接字连接?

  •  16
  • Alex  · 技术社区  · 17 年前

    我有一个应用程序,它使用简单的套接字在两个系统之间传递一些字符。我的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中维护此连接?

    4 回复  |  直到 13 年前
        1
  •  19
  •   Eddie    17 年前

        2
  •  10
  •   Community Mohan Dere    9 年前

    艾迪 said (比我早几秒!:),关闭写入程序和/或读取器将关闭底层套接字流 and the socket itself 但是,我相信插座本身不会关闭

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

    你不应该关闭作者或读者。只需刷新书写器,以确保您的消息将及时到达。稍后关闭套接字将关闭相应的流,因此您无需自己关闭它们。只需将读写器对象留给GC即可。

        3
  •  5
  •   L. Cornelius Dol    11 年前

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

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

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

        4
  •  2
  •   Peter Lawrey    17 年前

    您需要在关闭流之后关闭套接字。

    推荐文章