Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java套接字无限读块_Java_Sockets_Robots.txt - Fatal编程技术网

Java套接字无限读块

Java套接字无限读块,java,sockets,robots.txt,Java,Sockets,Robots.txt,在使用Java套接字时,我遇到了一个非常奇怪的问题。这个问题只发生在我正在处理的一小部分URL上。让我们调用一个示例url abc.com 编辑:url是lists.wikimedia.org/robots.txt,这给了我一些问题 我可以将/netcat/telnetlists.wikimedia.org与路径/robots.txt完美结合。Telnet甚至告诉我lists.wikimedia.org(见下文)的IP地址。但是,当我尝试使用Java套接字执行相同操作时,如下所示: Socket

在使用Java套接字时,我遇到了一个非常奇怪的问题。这个问题只发生在我正在处理的一小部分URL上。让我们调用一个示例url abc.com

编辑:url是lists.wikimedia.org/robots.txt,这给了我一些问题

我可以将/netcat/telnet
lists.wikimedia.org
与路径
/robots.txt
完美结合。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) {
    ...
}
读线无限阻塞,直到套接字超时

有人知道为什么会这样吗?同样的代码适用于大多数其他URL,有趣的是,这个错误只发生在一些ROBOTS.TXT请求中。。。我很困惑为什么会发生这种事

编辑:


有趣的是,使用ApacheHttpClient库可以为
lists.wikimedia.org/robots.txt
提供正确的结果。如果我想通过套接字手动执行此操作,是否还需要执行其他操作?

可能您缺少用于结束HTTP请求头的附加CRLF。我还将明确地编写它们,以避免平台混淆,例如(未经测试):

还考虑使用HTTURL连接代替普通套接字,去除所有这些负担:

HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setRequestMethod("HEAD");
...

Socket
没有
readLine()
方法。你不能仅仅打开Socket,期望它们给你一些东西。。如果您想更快地获得更好的帮助,您必须显示更多的代码。例如,发送一个格式正确的HTTP请求。哦,对不起,你们说得对,我没注意。我添加了读卡器的代码行,为我们提供了我需要使用套接字的特定URL,因为这是典型Java“写一次,运行所有地方”陷阱中的一个。(此处使用陷阱来避免“谎言”一词)。另一方面,在每个平台上都有正确的换行行为可能很有用,而不必关心。使用println()的问题不在于它不起作用。这是因为它使用系统的默认行终止符,但HTTP行终止符不依赖于系统:它被指定为\r\n(实际上从Telnet继承)。因此,您不应该将其用于Telnet派生的协议。您不应该在网络上真正使用PrintStream或PrintWriter,因为它们包含您需要了解的异常。
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setRequestMethod("HEAD");
...