繁体   English   中英

Java套接字读取无限阻塞

[英]Java socket read blocking infinitely

使用Java套接字时,我遇到了一个非常奇怪的问题。 仅对于我正在处理的非常小的一小部分网址会发生此问题。 我们以网址abc.com为例。

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

我可以使用路径/robots.txt完美卷曲/ 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手动进行操作,还需要做其他事情吗?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM