java.net.SocketException: 连接重置

184

我在尝试从套接字读取时遇到以下错误。我正在对该InputStream执行readInt()操作,但是出现了这个错误。查阅文档后发现,连接的客户端部分关闭了连接。在这种情况下,我是服务器。

我可以访问客户端日志文件,它没有关闭连接,并且其日志文件表明我正在关闭连接。那么有人知道为什么会发生这种情况吗?还有什么其他要检查的?当本地资源可能达到阈值时是否会出现这种情况?


我注意到我有以下这行代码:

socket.setSoTimeout(10000);

就在readInt()之前。有一个原因(长故事),但只是好奇,是否存在导致指定错误的情况?我在我的IDE中运行服务器,并且碰巧将我的IDE卡在断点上,然后我注意到我的日志中开始出现完全相同的错误。

总之,只是提一下,希望不是一个错误的提示。


2
你有双方的堆栈跟踪吗?你能更详细地描述一下网络架构吗?(是通过公共互联网传输还是在同一台机器上?还是介于两者之间?)这种情况是否一直发生?还是间歇性的? - Stu Thompson
请参见 https://dev59.com/duo6XIcBkEYKwwoYTzNK。 - Raedwald
我在使用WAMP时遇到了同样的问题,但通过在远程服务器上工作来解决了它。 - Florian-Martin
一般来说,我的问题是,SQL密码过期会导致这个问题吗? - Sm Srikanth
17个回答

0
在我的案例中,问题出在TSL版本上。我正在使用Retrofit与OkHttp客户端,并且在服务器端更新ALB后,我应该删除带有connectionSpecs的配置文件:
OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();
        List<ConnectionSpec> connectionSpecs = new ArrayList<>();
        connectionSpecs.add(ConnectionSpec.COMPATIBLE_TLS);
  //      clientBuilder.connectionSpecs(connectionSpecs);

因此,请尝试删除或添加此配置以使用不同的TSL配置。


0

我曾经在我的Netbeans7.4设置中的Apache控制台中收到过“NotifyUtil::java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:...)”消息。

我尝试了许多解决方案来摆脱它,最终成功的方法是启用Tomcat上的TLS。

以下是如何操作:

通过执行以下命令创建密钥库文件以存储服务器的私钥和自签名证书:

Windows:

"%JAVA_HOME%\bin\keytool" -genkey -alias tomcat -keyalg RSA

Unix:

$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA

并指定密码值为“changeit”。

根据https://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html(这将在您的本地用户目录中创建一个.keystore文件)

然后编辑 server.xml 文件(取消注释并编辑相关行)(%CATALINA_HOME%apache-tomcat-7.0.41.0_base \ conf \ server.xml),以启用 SSL 和 TLS 协议:

 <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
                maxThreads="150" scheme="https" secure="true"
                clientAuth="false" sslProtocol="TLS" keystorePass="changeit" />

希望这能有所帮助


0
总的来说,为了找到问题的根本原因,我发现使用像tcpdump这样的工具来跟踪进出的tcp数据包非常有帮助。 我发现这篇文章很有用,通过一个真实的会话示例,展示了使用一个样本复制器来检测连接重置问题的根本原因。

0
在我的经验中,我经常遇到以下情况:
  1. 如果您在一家公司工作,请联系网络和安全团队。因为在向外部服务发出请求时,可能需要授予相关端点的权限。

  2. 另一个问题是您的应用程序运行的服务器上的SSL证书可能已过期。


6
SSL证书不会导致连接重置。 - user207421

0
在我的情况下是DNS问题。我在主机文件中输入了已解析的IP,一切都正常工作了。当然这不是一个永久的解决方案,但可以给我时间来解决DNS问题。

这不会导致连接重置。 - undefined

0

我曾经遇到过这个问题。在我的情况下,由于在特定的Java类中重复使用相同的ClientRequest对象而导致错误。该项目正在使用Jboss Resteasy

  1. 最初只有一个方法在使用/调用对象ClientRequest(作为类中的全局变量)来请求特定URL。
  2. 之后,另一个方法被创建以获取另一个URL的数据,但仍然重复使用相同的ClientRequest对象。

解决方案:在同一类中创建了另一个ClientRequest对象,并且专门用于不被重复使用。


-1
我遇到了一个类似的套接字异常。我们设置了一个MFT SFTP连接,使用两个连续的control-m作业,每个作业发送10个1Mo大小的文件,持续1分钟,发送到一个外部服务器。有时,在我们的MFT日志中会出现以下错误,外部服务器上会缺少一个文件:
Error writing data to final destination. | Proxy error in reading file.
(...)
Failed to connect to ssh server. Exception: java.net.SocketTimeoutException

我们通过在两个Control-M作业的调度之间添加2分钟的延迟来修复了这个异常。

套接字超时不是连接重置。 - undefined

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