[英]Java socket read blocking infinitely
使用Java套接字時,我遇到了一個非常奇怪的問題。 僅對於我正在處理的非常小的一小部分網址會發生此問題。 我們以網址abc.com為例。
編輯:URL是lists.wikimedia.org/robots.txt
,它給我帶來了問題。
我可以使用路徑/robots.txt
完美卷曲/ netcat / telnet lists.wikimedia.org
。 Telnet甚至告訴我lists.wikimedia.org
的IP地址(請參見下文)。 但是,當我嘗試使用Java套接字進行如下操作時:
Socket s = new Socket("208.80.154.4", 80); // IP is same as the IP printed by telnet
BufferedWriter writer = new BufferedWriter(s.getOutputStream());
writer.println("HEAD /robots.txt HTTP/1.1");
writer.println("Host: lists.wikimedia.org");
writer.println("Connection: Keep-Alive");
writer.flush();
InputStreamReader r = new InputStreamReader(s.getInputStream());
BufferedReader reader = new BufferedReader(r);
String line;
while ((line = reader.readLine()) != null) {
...
}
readLine無限阻塞,直到套接字超時為止。
有誰知道為什么會這樣嗎? 相同的代碼可以在大多數其他URL上正常工作,有趣的是,此錯誤僅在某些ROBOTS.TXT請求中發生...我很困惑為什么會發生這種情況。
編輯:
有趣的是,使用apache HttpClient庫可以為lists.wikimedia.org/robots.txt
提供正確的結果。 如果要通過Socket手動進行操作,還需要做其他事情嗎?
可能您缺少用於結束HTTP請求標頭的附加CRLF。 我還將明確地編寫它們,以避免平台混亂,例如(未測試):
writer.print("HEAD /robots.txt HTTP/1.1\r\n");
writer.print("Host: lists.wikimedia.org\r\n");
writer.print("Connection: Keep-Alive\r\n");
writer.print("\r\n");
writer.flush();
還考慮使用HTTPURLConnection代替普通套接字,從而消除了所有這些負擔:
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setRequestMethod("HEAD");
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.