簡體   English   中英

Java套接字讀取無限阻塞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM