Java.net.SocketException: Socket Closed TCP 客户端服务器通信

6
我正在创建一个基于TCP的Java客户机/服务器应用程序,其中我们有两个套接字:
  • 一个用于交换消息。
  • 第二个用于文件传输。
我在服务器中创建了两个ServerSockets,以便通过接受ServerSockets 创建Socket One和Two。
首先,客户端通过第一个Socket发送一些字节,以便告诉服务器它需要哪个文件。
然后,服务器通过第二个套接字将文件发送到客户端。客户端接收文件后尝试向服务器发送传输完成消息。这时我会得到关闭套接字的异常。但是我一直没有关闭套接字。我只关闭了发送文件的缓冲区。即使在发送文件后再次尝试打开socketInputStream,错误仍然相同。如果我不关闭发送文件的缓冲区,则客户端无法获取文件。 服务器异常

返回消息中出现错误-java.net.SocketException: 套接字已关闭

客户端异常

服务器响应-java.net.SocketException: 软件导致连接中止:套接字写入错误

我做错了什么?

你应该添加一些代码和堆栈跟踪... - Jorge Cardoso
确保在其中一端关闭连接,如果不是这样的话,我肯定你正在关闭输入或输出流,在数据通信结束之前不要关闭它们,并且每当你想要向套接字发送数据时使用flush()方法。 - Vijay
1个回答

19

'Socket closed' 异常表示捕获异常的应用程序关闭了套接字并继续尝试使用它。您可能不知道,关闭套接字的输入或输出流也会关闭其他流和套接字。关于“软件引起的连接中止”,请参见重复链接。


我只关闭发送文件的缓冲区,也就是读取Socket的outPutStream的那个。这是我唯一认为会关闭Socket的地方。但如果我不关闭缓冲区,客户端就无法接收文件。 - lemanou
@lemanou,所以你关闭了套接字。然后稍后你收到了一个“套接字已关闭”的异常,因为你继续使用已关闭的套接字。你需要打开一个新的套接字。 - user207421
3
没错,那就是问题所在。我用 DataOutputStream 替换了缓冲读取器,并在使用 FileInputStream 读取文件后,将其发送到了 DataOutputStream 中。现在只需要关闭 FileInputStream 就可以完成“传输”了。谢谢! :) - lemanou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接