Col*_*inD 10 java sockets https exception httpurlconnection
我们有一个Webstart客户端,它通过HTTPS使用发送序列化对象与服务器通信java.net.HttpsURLConnection
.
在我的本地机器和办公室的测试服务器上,一切都运行得很好,但我遇到了一个非常非常奇怪的问题,这个问题只发生在我们的生产和登台服务器上(偶尔也会发生).我知道这些服务器和我们办公室的服务器之间的主要区别在于它们位于其他地方,与它们的客户端 - 服务器通信速度相当慢,但在此之前它在生产中也能正常工作.
无论如何,这是发生了什么:
Content-Type
on之类的属性之后,客户端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)
请注意,这不是a SocketTimeoutException
,如果在建立连接之前超时到期,则该connect()
方法HttpURLConnection
会抛出它.此外,当发生这种情况时,我可以打电话给conn.getResponseCode()
我,我的响应代码为200.
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();
Run Code Online (Sandbox Code Playgroud)
问题是,我不知道如何发生这种情况,特别是考虑到它偶尔会发生(我没有明确的活动模式),甚至只有当客户端和客户端之间存在(相对)高延迟时才会发生这种情况.服务器.
鉴于到目前为止我能找到的内容java.net.ConnectException: Connect timed out
,我想知道我们的服务器运行在网络上是不是网络或防火墙问题......但鉴于请求,这对我来说没有多大意义显然是通过servlet.此外,在同一网络上运行的其他应用程序尚未报告类似问题.
有谁知道这可能是什么原因,甚至我应该调查什么?
我们遇到过与您类似的情况.通常在高负荷下并且在测试时不易重现.还没有解决它,但这是我们经历的步骤.
如果是防火墙问题,我们会收到拒绝连接或SocketTimeout异常.
1)您是否能够在服务器上的访问日志中跟踪这些请求 - 它们是否显示HTTP状态200或404或其他?在我们的例子中,服务器(在本例中为IIS)日志显示客户端关闭了连接而不是服务器.所以这是一个谜.
更新:如果客户总是得到一个200,那么服务器实际上已经发回了一些回应,但我怀疑的响应字节大小(如果这是记录在访问日志)将与正常响应大小的显示出不同的价值为那个要求.
如果它显示相同大小的响应,那么您有一个(可能不合理)条件,服务器实际上正确响应但客户端没有得到响应,因为连接在两者之间的某处终止.
2)网络管理团队查看TCP/IP流量以确定哪一端(或中间路由器)正在终止HTTP/TCP-IP对话.一旦我们了解哪一端正在终止,那么连接就是为什么.知识渊博的人可以窥探
3)服务器上是否配置/限制了最大数量的请求 - 是否限制了您的连接?
4)是否有可以丢弃请求的中间负载平衡器?
更新:我们想要的另一件事,但没有完成的是在客户端和服务器之间创建静态路由以减少其间的跳数并确保没有与网络相关的连接丢失.见http://en.wikipedia.org/wiki/Static_routing
5)另一个建议是设置ConnectTimeout以查看它们是否具有更高的值. 更新:你可能想尝试conn.getErrorStream()
如果连接失败但服务器仍发送有用数据,则返回错误流.如果未连接连接,或者连接时服务器没有错误,或者服务器出现错误但未发送错误数据,则此方法将返回null.
6)还可以尝试在服务器上相隔5秒钟进行一组线程转储,以查看是否有任何线程在服务器上显示这些传入请求.
更新:截至今天,我们学会了解决这个问题,因为我们总计故障率为每天400,000个请求中的200-300,即0.00075%
归档时间: |
|
查看次数: |
43178 次 |
最近记录: |