我有'n'个服务器线程,每个人都听一个客户端。
当服务器线程从其客户端收到消息时,它需要通知其他'n-1'客户端,这就是为什么我保留一个共享对象(包含'n'套接字数组的原因,每个对应一个客户端)服务器线程之间。
此外,在持有ServerSocket
的主服务器线程中,每次我接受与客户端的新连接时,我打开BufferedWriter/Reader
以使用从中返回的新套接字给他第一个答案ServerSocket.accept()
。
如果回答“OK”,我会打开一个新线程,将新套接字传递给它,以便收听新客户端的以下请求。
问题是我无法关闭主服务器线程中的BufferedReader
和BufferedWriter
,因为它也会关闭底层流,导致正在侦听该套接字的服务器线程出现问题/流。
问题是:如果我在新线程中打开另一个BufferedReader
(绑定到同一个套接字),然后关闭它,那么其他BufferedReaders(Writers)
(特别是在主服务器线程中打开的那个) ,我以前无法关闭)在同一个插座上打开关闭?是否会抛出异常?
有可能共享打开的BufferedReader / Writer
而不是套接字,以避免每次新对象实例化,但这是一个问题,如果我以上述方式执行操作会发生什么。
请告诉我,如果我不清楚,我的英语不是很好。
答案 0 :(得分:3)
关闭套接字将关闭两个流。
换句话说,关闭其中任何一个都会关闭它。
正如评论中所述,围绕单个流的多个缓冲流/读者/写作者无法工作。
读取/写入同一套接字的多个线程也不太可能正常工作,除非您非常注意同步和缓冲。
您需要重新考虑您的设计。
答案 1 :(得分:1)
每个与另一个Socket打开连接的Socket都有一个打开的InputStream和一个打开的OutputStream。关闭这些流中的任何一个也将关闭套接字。关闭套接字或其流不会影响其他套接字,除非它们已连接。除非您还想使用流关闭套接字之间的连接,否则不希望关闭任何流。请询问我是否遗漏了某些内容或者您是否有其他问题:)