Jin*_*Jin 2 java sockets robots.txt
使用Java套接字时,我有一个非常奇怪的问题.这个问题只发生在我正在处理的网址的非常小的子集中.我们打电话给一个例子url abc.com.
编辑:网址lists.wikimedia.org/robots.txt给我带来了问题.
我可以lists.wikimedia.org用路径/robots.txt完美地卷曲/ netcat/telnet .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) {
...
}
Run Code Online (Sandbox Code Playgroud)
readLine无限地阻塞,直到套接字超时......
有没有人知道为什么会这样?相同的代码适用于大多数其他URL,有趣的是,这个bug只发生在一些ROBOTS.TXT请求中......我很困惑,为什么会发生这种情况.
编辑:
有趣的是,使用apache HttpClient库为我提供了正确的结果lists.wikimedia.org/robots.txt.如果我想通过Socket手动完成,我还需要做些什么吗?
您可能缺少额外的CRLF来结束HTTP请求标头.我也会明确地写它们,以避免平台混淆,如此(未经测试):
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();
Run Code Online (Sandbox Code Playgroud)
还考虑使用HTTPURLConnection而不是普通套接字,带走所有这些burdons:
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setRequestMethod("HEAD");
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1643 次 |
| 最近记录: |