【问题标题】:Java socket read blocking infinitelyJava socket 无限读阻塞
【发布时间】:2013-04-18 03:55:27
【问题描述】:

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

编辑:网址是lists.wikimedia.org/robots.txt,这给我带来了问题。

我可以 curl/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) {
    ...
}

readLine 无限阻塞,直到套接字超时...

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

编辑:

有趣的是,使用 apache HttpClient 库为我提供了 lists.wikimedia.org/robots.txt 的正确结果。如果我想通过 Socket 手动完成,我还需要做些什么吗?

【问题讨论】:

  • Socket 没有 readLine() 方法。
  • 你不能只是打开套接字并期望他们给你一些东西。如果你想尽快得到更好的帮助,你将不得不显示更多的代码。
  • 如中,发送格式正确的 HTTP 请求。
  • 糟糕,抱歉,你们是对的,我没注意。我添加了我得到读者的行
  • 给我们具体的网址

标签: java sockets robots.txt


【解决方案1】:

您可能缺少用于结束 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");
...

【讨论】:

  • 我需要使用Socket,因为这是一个作业哈哈
  • 典型的Java“一次编写,到处运行”的陷阱之一。 (这里使用的陷阱是为了避免使用“谎言”这个词)。另一方面,在每个平台上都有正确的换行行为可能会很有用,而无需关心。
  • 使用 println() 的问题不在于它不起作用。就是它使用系统的默认行终止符,但 HTTP 行终止符不依赖于系统:它被指定为 \r\n (实际上是从 Telnet 继承的)。因此,您不应该将它用于 Telnet 派生协议。您不应该真正在网络上使用 PrintStream 或 PrintWriter,因为它们会吞下您需要了解的异常。
猜你喜欢
  • 2018-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 2018-03-13
  • 1970-01-01
相关资源
最近更新 更多