我们有一个 Webstart 客户端,它通过 HTTPS 使用java.net.HttpsURLConnection
.
在我的本地机器和位于我们办公室的测试服务器上,一切都运行良好,但我遇到了一个非常非常奇怪的问题,它只发生在我们的生产和登台服务器上(偶尔会发生)。我所知道的这些服务器与我们办公室的服务器之间的主要区别在于它们位于其他地方并且与它们的客户端-服务器通信要慢得多,但在此之前它在生产中也能正常工作很长时间。
无论如何,这就是发生的事情:
- 客户端在设置读取超时等选项和
Content-Type
on 等属性后HttpURLConnection
,调用getOutputStream()
它以获取要写入的流。 - 在这一点上,据我所知,客户端挂了一段时间。
- 然后客户端抛出以下异常:
java.net.ConnectException:连接超时:连接 在 java.net.PlainSocketImpl.socketConnect(本机方法) 在 java.net.PlainSocketImpl.doConnect(未知来源) 在 java.net.PlainSocketImpl.connectToAddress(未知来源) 在 java.net.PlainSocketImpl.connect(未知来源) 在 java.net.SocksSocketImpl.connect(未知来源) 在 java.net.Socket.connect(未知来源) 在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(未知来源) 在 com.sun.net.ssl.internal.ssl.BaseSSLSocketImpl.connect(未知来源) 在 sun.net.NetworkClient.doConnect(未知来源) 在 sun.net.www.http.HttpClient.openServer(未知来源) 在 sun.net.www.http.HttpClient.openServer(未知来源) 在 sun.net.www.protocol.https.HttpsClient.(未知来源) 在 sun.net.www.protocol.https.HttpsClient.New(未知来源) 在 sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(未知来源) 在 sun.net.www.protocol.http.HttpURLConnection.plainConnect(未知来源) 在 sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(未知来源) 在 sun.net.www.protocol.http.HttpURLConnection.getOutputStream(未知来源) 在 sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(未知来源)
请注意,这不是 a ,如果在建立连接之前超时到期SocketTimeoutException
,该connect()
方法会抛出它。HttpURLConnection
此外,当这种情况发生时,我可以拨打电话conn.getResponseCode()
并收到 200 的响应代码。
- 在服务器端,
EOFException
在 的构造函数中抛出anObjectInputStream
,它尝试读取序列化标头但失败,因为客户端永远无法OutputStream
写入。
如果它有帮助,这里是在调用HttpsURLConnection
之前进行的调用getOutputStream()
(编辑以仅显示正在进行的调用,而不是执行此操作的代码的整个结构):
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setUseCaches(false);
conn.setReadTimeout(30000);
conn.setRequestProperty("Cookie", cookie);
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/x-java-serialized-object");
conn.getOutputStream();
问题是,我不知道这一切是如何发生的,特别是考虑到它只是偶尔发生(我无法分辨出明确的活动模式),即使这样也只有在客户端和客户端之间存在(相对)高延迟时服务器。
鉴于到目前为止我能够找到的内容java.net.ConnectException: Connect timed out
,我想知道这是否不是我们的服务器正在运行的网络上的一些网络或防火墙问题......但考虑到请求,这对我来说没有多大意义显然是通过 servlet。此外,在同一网络上运行的其他应用程序也没有报告类似的问题。
有谁知道这可能是什么原因,甚至我应该调查什么?