在使用 Java 套接字时,我遇到了一个非常奇怪的问题。这个问题只发生在我正在处理的 URL 的一个非常小的子集上。让我们调用一个示例 url abc.com。
编辑: urllists.wikimedia.org/robots.txt
给我带来了问题。
我可以完美地lists.wikimedia.org
使用路径curl/netcat/telnet 。/robots.txt
Telnet 甚至告诉我 IP 地址lists.wikimedia.org
(见下文)。但是,当我尝试使用 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 手动完成,我还需要做些什么吗?