关闭BufferedWriter / Reader会影响绑定到同一套接字的其他实例吗?

时间:2015-05-13 22:01:10

标签: java multithreading sockets

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

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

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

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

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

问题是:如果我在新线程中打开另一个BufferedReader(绑定到同一个套接字),然后关闭它,那么其他BufferedReaders(Writers)(特别是在主服务器线程中打开的那个) ,我以前无法关闭)在同一个插座上打开关闭?是否会抛出异常?

有可能共享打开的BufferedReader / Writer而不是套接字,以避免每次新对象实例化,但这是一个问题,如果我以上述方式执行操作会发生什么。

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

2 个答案:

答案 0 :(得分:3)

  1. 关闭包裹在流中的任何Reader或Writer或流会关闭包装的流。
  2. 关闭套接字的输入流或输出流将关闭另一个流和套接字。
  3. 关闭套接字将关闭两个流。

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

  4. 正如评论中所述,围绕单个流的多个缓冲流/读者/写作者无法工作。

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

  6. 您不应该在接受循环中使用已接受的套接字执行任何I / O.否则你可以阻止,这会影响更多的客户。
  7. 您需要重新考虑您的设计。

答案 1 :(得分:1)

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