Java ソケットを使用しているときに、非常に奇妙な問題が発生します。この問題は、私が処理している URL の非常に小さなサブセットでのみ発生しています。URL の例を abc.com としましょう。
編集:urlはlists.wikimedia.org/robots.txt
私に問題を引き起こします。
lists.wikimedia.org
パスを使用してcurl/netcat/telnetを/robots.txt
完全に正常に実行できます。lists.wikimedia.org
Telnet は、 (以下を参照)の 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
ます。ソケット経由で手動で実行したい場合、他に何かする必要がありますか?