给出此堆栈跟踪片段导致:java.net.SocketException:软件导致连接中止:java.net.SocketOutputStream.socketWrite0(本机方法)处的套接字写入错误
给出这个堆栈跟踪片段
原因:java.net.SocketException:软件导致连接中止:套接字写入错误
在 java.net.SocketOutputStream.socketWrite0(本机方法)
我尝试回答以下问题:
关于#1:
Sun 的 JVM 源代码不包含这个确切的消息,但我认为文本 软件导致连接中止:套接字写入错误 来自本机实现 SocketOutputStream
:
private native void socketWrite0(FileDescriptor fd, byte[] b, int off,
int len) throws IOException;
关于#2
我的猜测是,这是由于客户端在获得完整响应之前终止连接而导致的(例如,发送了请求,但在获得完整响应之前,它已关闭/终止/离线)
问题:
我需要证明这个堆栈跟踪是套接字客户端的“错误”,并且服务器无法采取任何措施来避免它。(除了捕获异常或使用非 Sun JVM SocketOutputStream,尽管两者都不能真正避免客户端已终止的事实)
尽管将正确的证书导入 cacerts trustore,但 SSLPoke.bat(SSL 故障排除脚本)窗口脚本仍然出现此错误。
C:\Java\jdk1.8.0_111\jre\lib\security>SSLPoke.bat
C:\Java\jdk1.8.0_111\jre\lib\security>"C:\jdk1.8.0_101\jre\bin\java"
`SSLPoke tfs.corp.****.com 443`
java.net.SocketException: Software caused connection abort: recv failed
`at java.net.SocketInputStream.socketRead0(Native Method)`
`at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)`
`at java.net.SocketInputStream.read(SocketInputStream.java:170)`
`at java.net.SocketInputStream.read(SocketInputStream.java:141)`
`at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)`
`at sun.security.ssl.InputRecord.read(InputRecord.java:503)`
`at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973)`
`at sun.security.ssl.SSLSocketImpl.performInitialHandshake
(SSLSocketImpl.java:1375)`
`at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:747)`
`at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123)`
`at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:138)`
`at SSLPoke.main(SSLPoke.java:28)`
在网络中 -Djava.net.preferIPv4Stack=true to make connections to certain machines
添加 JVM 参数
C:\Java\jdk1.8.0_111\jre\lib\security>"C:\Java\jdk1.8.0_111\bin\java"
**-Djava.net.preferIPv4Stack=true** SSLPoke tfs.corp.****.com 443
连接成功
SSLPoke 的代码可以从这里下载: https://gist.github.com/4ndrej/4547029