Java套接字连接在读取最后一行前60秒挂起



我通过Java套接字手工开发了一个soap连接(这是一个非常简单的soap请求,Axis给了很多构建问题)。

为了实现这一点,我基本上复制了我从Soap UI中获取的HTTP头,并编码如下:

String hostname = "aaaaa";
int port = 11111;
InetAddress  addr = InetAddress.getByName(hostname);
Socket sock = new Socket(addr, port);
sock.setSoTimeout(100000);
BufferedWriter  wr = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream(),"UTF-8"));
wr.write("POST " + "http://aaaa:11111/servicePath" + " HTTP/1.1rn");
wr.write("Host: aaaaa:11111rn");
wr.write("Accept-Encoding: gzip,deflatern");
wr.write("Content-Length: " + soapXml.length() + "rn");
wr.write("Content-Type: text/xml; charset="UTF-8"rn");
//wr.write("Connection: Keep-Alivern");
wr.write("SOAPAction: "/someSoapAction"rn");
wr.write("User-Agent: Apache-HttpClient/4.1.1 (java 1.5)rn");
wr.write("rn");
wr.write(soapXml);
wr.flush();

请求是成功的,这意味着我从服务获得了我所期望的响应。例如,当我把我手写的"soapXml"一些无效的参数,我得到一个500错误的XML解释问题,如果我设置正确,我得到一个200 OK与XML正文后面的头。

问题是套接字在读取HTTP正文前60秒挂起,如果是200OK

它基本上读取整个报头,然后等待60秒,然后(我认为某些协议超时)最后读取xml正文。

下面是我读取响应的代码:
String line;
BufferedReader rd = new BufferedReader(new java.io.InputStreamReader(sock.getInputStream(),"UTF-8"));
while ((line = rd.readLine()) != null) { 
            i++;
            LOG.debug("cycle: "+i+" -------- "+line);
                     //after printing the header, it hangs 60 seconds before printing the follwing XML  
            if ((line.length() >0) && (line.charAt(0) == '<'))
            {
                responseXML = line;
            }
}

下面是一个示例200 OK标头:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/xml;charset=utf-8
Content-Length: 1052
Date: Sun, 13 Jan 2013 08:33:45 GMT -- hanging 60 seconds here
-- blank line
<?xml version="1.0" encoding="UTF-8"?>................</SOAP-ENV:Envelope>

有人遇到过这种情况吗?请注意,这显然不是服务器问题,因为使用soap UI会立即提供答案。

谢谢

服务器为HTTP keep-alive保持连接打开,显然是60秒的超时。要么更改为HTTP 1.0,否则请注意返回的Content-length头并停止读取那么多字节。

服务器环境的改变(提供了一台新机器)解决了这个问题。

现在200OK的响应时间也低于1秒。

不幸的是,我没有任何关于环境的技术堆栈的细节。无论如何,谢谢你的帮助。

最新更新