gpt4 book ai didi

Java套接字读取无限阻塞

转载 作者:行者123 更新时间:2023-11-30 06:25:08 25 4
gpt4 key购买 nike

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

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

我可以使用路径 /robots.txt curl/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 手动完成,我还需要做些什么吗?

最佳答案

可能您缺少额外的 CRLF 来结束 HTTP 请求 header 。我也会明确地写它们,以避免平台混淆,就像这样(未经测试):

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");
...

关于Java套接字读取无限阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16067998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com