【发布时间】:2011-04-22 02:40:25
【问题描述】:
我们有一个 Webstart 客户端,它通过 HTTPS 使用 java.net.HttpsURLConnection 发送序列化对象来与服务器通信。
在我的本地机器和位于我们办公室的测试服务器上一切正常,但我遇到了一个非常非常奇怪的问题,它只发生在我们的生产和登台服务器上(偶尔会发生)。我所知道的这些服务器和我们办公室的服务器之间的主要区别在于它们位于其他地方并且与它们的客户端-服务器通信要慢得多,但在此之前它在生产中也能正常工作很长时间。
无论如何,这就是正在发生的事情:
- 客户端在
HttpURLConnection上设置读取超时和Content-Type等属性后,在其上调用getOutputStream()以获取要写入的流。 - 此时,据我所知,客户端挂起一段时间。
- 然后客户端抛出以下异常:
请注意,这不是SocketTimeoutException,HttpURLConnection 上的connect() 方法表示,如果在建立连接之前超时到期,它会抛出它。此外,当这种情况发生时,我可以拨打 conn.getResponseCode() 并收到 200 的响应代码。
- 在服务器端,
EOFException被抛出ObjectInputStream的构造函数,该构造函数尝试读取序列化标头但失败,因为客户端从未获得要写入的OutputStream。
如果有帮助,以下是在调用 getOutputStream() 之前在 HttpsURLConnection 上进行的调用(经过编辑以仅显示正在进行的调用,而不是执行此操作的代码的整个结构):
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。此外,在同一网络上运行的其他应用未报告类似问题。
有谁知道这可能是什么原因,甚至我应该调查什么?
【问题讨论】:
-
根据bugs.sun.com/bugdatabase/view_bug.do?bug_id=6319814 java.net.ConnectException 的“评估”,可以“或者”因超时“或”因任何其他随机错误原因而抛出......如果这有帮助的话跨度>
标签: java sockets exception https httpurlconnection