[英]Java socket connection hangs 60 seconds before reading last line
我已經通過Java套接字手動開發了一個肥皂連接(這是一個非常簡單的肥皂請求,而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.1\r\n");
wr.write("Host: aaaaa:11111\r\n");
wr.write("Accept-Encoding: gzip,deflate\r\n");
wr.write("Content-Length: " + soapXml.length() + "\r\n");
wr.write("Content-Type: text/xml; charset=\"UTF-8\"\r\n");
//wr.write("Connection: Keep-Alive\r\n");
wr.write("SOAPAction: \"/someSoapAction\"\r\n");
wr.write("User-Agent: Apache-HttpClient/4.1.1 (java 1.5)\r\n");
wr.write("\r\n");
wr.write(soapXml);
wr.flush();
請求成功,這意味着我可以從服務中獲得期望的響應。 例如,當我用手寫的“ soapXml”輸入一些無效的參數時,XML會返回500錯誤以解釋該問題,如果正確設置所有內容,則會在標頭后出現一個帶有XML正文的200 OK。
問題是在200OK的情況下,套接字在讀取HTTP正文之前會掛起60秒。
它基本上讀取完整的標頭,然后等待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保持活動狀態保持連接打開狀態,顯然是60秒超時。 要么更改為HTTP 1.0,要么記下返回的Content-length標頭,然后停止讀取那么多字節。
服務器環境更改(提供了新計算機)解決了該問題。
現在200OK的響應時間也低於1秒。
不幸的是,我沒有關於環境技術堆棧的任何細節。 無論如何,謝謝您的幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.