2013-04-17 20 views
2

我有一个很奇怪的问题与Java插座工作时。这个问题只发生在我正在处理的网址的一小部分。我们来看一个例子url abc.com。的Java套接字读取阻断无限

编辑:网址是lists.wikimedia.org/robots.txt,让我的问题。

我可以卷曲/ netcat的/远程登录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,有趣的是,这个bug只发生在一些ROBOTS.TXT请求中......我很困惑为什么会发生这种情况。

编辑:

有趣的是,使用Apache HttpClient库让我对lists.wikimedia.org/robots.txt正确的结果。如果我想通过Socket手动执行,还有其他事情需要做吗?

+2

'Socket'没有'readLine()'方法。 –

+4

你不能只是打开插座,并期望他们给你的东西..你会不得不表现出更多的代码,如果你想更好地帮助越快。 – ddmps

+0

如同发送格式正确的HTTP请求。 –

回答

5

也许你错过了额外的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(); 

也考虑使用HttpURLConnection的,而不是普通的插座,带走了这一切burdons:

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

谢谢你,\ r \ n工作,永远不要使用PRINTLN再 – Jin

+0

我需要使用套接字,因为这是一个任务haha – Jin

+0

一个典型的Java“一次写入,运行到任何地方”的陷阱。 (这里使用陷阱来避免“谎言”一词)。另一方面,在每个平台上都有正确的换行符可能是有用的,而不需要关心。 –