Fiji/ImageJ更新失败:java.net.URLConnection HTTP/HTTPS连接异常
调试Fiji/ImageJ更新失败问题
问题背景
本地Fiji/ImageJ安装无法通过「帮助→更新UI」完成更新,触发问题的代码位于ImageJ的swing更新模块中(对应ImageJUpdater.java的360-370行)。
最小复现测试用例
将JAVA_HOME指向Fiji/ImageJ自带的JDK目录:
/Applications/Fiji.app/java/macosx/zulu8.60.0.21-ca-fx-jdk8.0.322-macosx_x64/jre/Contents/Home
测试代码:
import java.net.URL; import java.net.URLConnection; import java.io.IOException; import java.net.HttpURLConnection; class HelloWorld { public static void main(String[] args) { try { final URL url = new URL("http://neverssl.com"); final URLConnection urlConn = url.openConnection(); final HttpURLConnection httpConn = (HttpURLConnection) urlConn; final int code = httpConn.getResponseCode(); } catch (IOException ioe) { ioe.printStackTrace(); } } }
错误日志
HTTP地址请求错误
java.io.IOException: Error writing to server at sun.net.www.protocol.http.HttpURLConnection.writeRequests(HttpURLConnection.java:705) at sun.net.www.protocol.http.HttpURLConnection.writeRequests(HttpURLConnection.java:717) at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1598) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1505) at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480) at HelloWorld.main(HelloWorld.java:14)
HTTPS地址请求错误
javax.net.ssl.SSLException: Couldn't kickstart handshaking at sun.security.ssl.Alert.createSSLException(Alert.java:127) at sun.security.ssl.TransportContext.fatal(TransportContext.java:348) at sun.security.ssl.TransportContext.fatal(TransportContext.java:291) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:449) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:410) at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:197) at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1577) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1505) at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:352) at HelloWorld.main(HelloWorld.java:14) Suppressed: java.net.SocketException: Broken pipe (Write failed) at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111) at java.net.SocketOutputStream.write(SocketOutputStream.java:155) at sun.security.ssl.SSLSocketOutputRecord.encodeAlert(SSLSocketOutputRecord.java:81) at sun.security.ssl.TransportContext.fatal(TransportContext.java:379) ... 10 more Caused by: java.net.SocketException: Broken pipe (Write failed) at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111) at java.net.SocketOutputStream.write(SocketOutputStream.java:155) at sun.security.ssl.SSLSocketOutputRecord.flush(SSLSocketOutputRecord.java:251) at sun.security.ssl.HandshakeOutStream.flush(HandshakeOutStream.java:89) at sun.security.ssl.ClientHello$ClientHelloKickstartProducer.produce(ClientHello.java:580) at sun.security.ssl.SSLHandshake.kickstart(SSLHandshake.java:510) at sun.security.ssl.ClientHandshakeContext.kickstart(ClientHandshakeContext.java:112) at sun.security.ssl.TransportContext.kickstart(TransportContext.java:231) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:432) ... 8 more
网络抓包分析
对比故障机器与正常机器的tcpdump结果,发现故障机器会在发送PSH包前提前发送FIN包,推测问题与连接提前关闭有关。在另一台同版本OS X机器上,指向相同JAVA_HOME目录运行同一测试代码则无异常。
内容的提问来源于stack exchange,提问作者SidSethupathi
相关产品推荐
相关产品推荐

