java.net.SocketException:套接字关闭 TCP 客户端服务器通信 [重复]

Posted

技术标签:

【中文标题】java.net.SocketException:套接字关闭 TCP 客户端服务器通信 [重复]【英文标题】:java.net.SocketException: socket closed TCP Client Server Communication [duplicate] 【发布时间】:2013-03-24 00:54:46 【问题描述】:

我正在通过 TCP 创建一个 java 客户端/服务器应用程序,其中我们有两个套接字:

一个用于交换消息。 两个用于文件传输。

我在服务器中创建了两个 ServerSocket,以便创建 Socket 1 和 2 通过接受 ServerSockets。

首先客户端通过第一个 Socket 发送一些字节 这样它就可以告诉服务器它需要哪个文件。

然后服务器通过第二个套接字将文件发送给客户端。 客户端收到文件后,会尝试向服务器发送一条传输完成消息。 在那里我得到了关闭套接字的异常。 但是,直到现在我才关闭套接字。 我只关闭发送文件的缓冲区。 即使我在发送文件后尝试再次打开 socketInputStream,错误仍然是一样的。 另外,如果我不关闭发送文件的缓冲区,客户端将无法获取文件。

服务器异常

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

客户端异常

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

我做错了什么?

【问题讨论】:

你真的应该添加一些代码和堆栈跟踪...... 确保您在最后一个关闭连接,如果不是这种情况,我确定您关闭输入或输出流,在您确定您之前不要关闭它们数据通信结束,只要你想向套接字发送数据,就使用 flush() 方法 【参考方案1】:

“套接字关闭”异常意味着捕获异常的应用程序关闭了套接字,然后继续尝试使用它。您可能没有意识到关闭套接字的输入或输出流也会关闭另一个流和套接字。对于“软件导致的连接中止”,请参阅重复链接。

【讨论】:

我只关闭发送文件的缓冲区,也就是读取Socket的outPutStream的缓冲区。那是我唯一认为正在关闭套接字的一个。如果我不关闭缓冲区,客户端不会收到文件。 @lemanou 所以你关闭了套接字。然后你得到一个“套接字关闭”异常,因为你一直在使用关闭的套接字。您将不得不打开一个新的。 其实是的。这就是问题所在。我用 DataOutputStream 替换了缓冲区读取器,在用 FileInputStream 读取文件后,我通过 DataOutputStream 发送了它。我现在只需关闭 FileInputStream 即可完成“传输”。谢谢! :)

以上是关于java.net.SocketException:套接字关闭 TCP 客户端服务器通信 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

是啥导致我的 java.net.SocketException:连接重置? [复制]

如何修复 java.net.SocketException:损坏的管道?

Java 1.6 HttpsURLConnection:java.net.SocketException:连接重置

java.net.SocketException:recvfrom 失败:ETIMEDOUT(连接超时)

java.net.SocketException:软件导致连接中止:recv 失败 [重复]

如何解决 java.net.SocketException:使用 selenium 的 java 中的连接重置异常?