【问题标题】:Closing BufferedWriter/Reader affects other instances bound to the same socket?关闭 BufferedWriter/Reader 会影响绑定到同一个套接字的其他实例吗?
【发布时间】:2015-05-13 22:01:09
【问题描述】:

我有 'n' 个服务器线程,每个线程都监听 1 个客户端。

当服务器线程从其客户端接收到消息时,它需要通知其他“n-1”个客户端,这就是为什么我保留一个共享对象(包含一个“n”个套接字数组,每个套接字一个客户端)在服务器线程之间。

此外,在拥有ServerSocket 的主服务器线程中,每次我接受与客户端的新连接时,我都会打开一个BufferedWriter/Reader 以使用从ServerSocket.accept() 返回的新套接字给他第一个答案。

如果回答“OK”,我会打开一个新线程,将新套接字传递给它,以便监听新客户端的以下请求。

问题是我无法关闭主服务器线程中的BufferedReaderBufferedWriter,因为它也会关闭底层流,从而导致正在侦听该套接字/流的服务器线程出现问题。

还有问题:如果我在新线程中打开另一个BufferedReader(绑定到同一个套接字),然后关闭它,其他BufferedReaders(Writers)(特别是在主服务器线程中打开的那些,我不能't close before ) 在同一个套接字上打开被关闭?他们会抛出异常吗?

可以共享打开的BufferedReader / Writer 而不是套接字,以避免每次都实例化一个新对象,但这是一个与如果我按照上述方式做事会发生什么有关的问题。

如果我不清楚,请告诉我,我的英语不是很好。

【问题讨论】:

  • 我会建议在 main 线程和其他线程中不共享任何内容。每个线程都应该在自己的范围内维护其数据,您将不会遇到任何混乱的问题。
  • 您不能在同一个流上可靠地拥有多个 BufferedReader/BufferedWriter。不管他们是否在同一个线程上。

标签: java multithreading sockets


【解决方案1】:
  1. 关闭任何 Reader 或 Writer 或围绕流包裹的流会关闭包裹的流。
  2. 关闭套接字的输入流或输出流会关闭另一个流和套接字。
  3. 关闭套接字会关闭两个流。

    换句话说,关闭其中的任何一个都会关闭所有的。

  4. 如 cmets 中所述,环绕单个流的多个缓冲流/读取器/写入器无法工作。

  5. 读取/写入同一个套接字的多个线程也不太可能正常工作,除非您非常注意同步和缓冲。

  6. 不应在接受循环中对接受的套接字执行任何 I/O。否则你可以屏蔽,这会影响更多的客户。

您需要重新考虑您的设计。

【讨论】:

  • 我正在研究有关关闭包装套接字的流的顺序的类似内容,我打算问这个问题,但你在 #3 中回答了它。你有这个说法的来源吗?我什么都没找到
  • @Hilikus 来源是 Javadoc,您首先查看的位置。无论如何,没有其他任何意义。套接字关闭时,流如何保持打开状态?
【解决方案2】:

每个与另一个 Socket 建立开放连接的 Socket 都有一个开放的 InputStream 和一个开放的 OutputStream。关闭这些流中的任何一个也将关闭套接字。关闭套接字或其流不会影响其他套接字,除非它们已连接。您不想关闭任何流,除非您还想使用流关闭套接字之间的连接。请询问我是否遗漏了什么或者您有其他问题:)

【讨论】:

  • 也许我没有理解你的答案,但我说的是关闭绑定到同一个套接字的读取器/写入器,所以,如果我没记错的话,它们共享同一个流。我将编辑我的问题以使其更清晰
  • 您不能将不同的读取器/写入器绑定到同一个套接字,只能绑定它们的输入/输出流,尽管我不建议这样做。并且关闭缓冲的读取器/写入器也会关闭它缓冲的流(套接字),但它也会影响缓冲同一流的任何其他缓冲读取器/写入器,因为它现在已关闭。
  • 关闭套接字会关闭两个流,为什么几乎在互联网上的每个示例中都会关闭它们?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 1970-01-01
  • 2011-12-06
  • 2013-07-17
  • 2016-02-22
  • 2018-09-18
  • 1970-01-01
相关资源
最近更新 更多