什么可能导致套接字连接异常:连接超时?
我们有一个 Webstart 客户端,它通过使用 通过 HTTPS 发送序列化对象来与服务器进行通信。java.net.HttpsURLConnection
在我的本地计算机和位于我们办公室的测试服务器上,一切都运行良好,但我遇到了一个非常非常奇怪的问题,这个问题只发生在我们的生产和过渡服务器上(而且偶尔发生)。据我所知,这些服务器与我们办公室中的服务器之间的主要区别在于它们位于其他地方,并且与它们的客户端 - 服务器通信要慢得多,但是在此之前,它在生产中运行了很长时间。
无论如何,这是正在发生的事情:
- 客户端在设置了读取超时等选项和属性(如 on)后,会调用它来获取要写入的流。
Content-Type
HttpURLConnection
getOutputStream()
- 在这一点上,据我所知,客户端挂起了一段时间。
- 然后,客户端将引发以下异常:
java.net.ConnectException: Connection timed out: connect at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(Unknown Source) at java.net.PlainSocketImpl.connectToAddress(Unknown Source) at java.net.PlainSocketImpl.connect(Unknown Source) at java.net.SocksSocketImpl.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(Unknown Source) at com.sun.net.ssl.internal.ssl.BaseSSLSocketImpl.connect(Unknown Source) at sun.net.NetworkClient.doConnect(Unknown Source) at sun.net.www.http.HttpClient.openServer(Unknown Source) at sun.net.www.http.HttpClient.openServer(Unknown Source) at sun.net.www.protocol.https.HttpsClient.(Unknown Source) at sun.net.www.protocol.https.HttpsClient.New(Unknown Source) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(Unknown Source) at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source) at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(Unknown Source)
请注意,这不是一个 ,如果超时在建立连接之前过期,则方法上的方法会说它会引发。此外,当这种情况发生时,我可以打电话,我得到的响应代码为200。SocketTimeoutException
connect()
HttpURLConnection
conn.getResponseCode()
- 在服务器端,在 的构造函数中抛出 an,它试图读取序列化标头,但失败,因为客户端从未获取要写入的内容。
EOFException
ObjectInputStream
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();
问题是,我不知道这些是如何发生的,特别是考虑到它只是偶尔发生(我能说出明确的活动模式),即使这样,客户端和服务器之间(相对)高延迟时也是如此。
鉴于到目前为止我能够找到的关于,我想知道这是否不是我们的服务器运行的网络上的某个网络或防火墙问题...但这对我来说没有多大意义,因为请求显然是通过servlet的。此外,在同一网络上运行的其他应用程序尚未报告类似的问题。java.net.ConnectException: Connect timed out
有没有人知道这可能是什么原因,甚至我应该调查什么?