2

Java ソケットを使用しているときに、非常に奇妙な問題が発生します。この問題は、私が処理している URL の非常に小さなサブセットでのみ発生しています。URL の例を abc.com としましょう。

編集:urlはlists.wikimedia.org/robots.txt私に問題を引き起こします。

lists.wikimedia.orgパスを使用してcurl/netcat/telnetを/robots.txt完全に正常に実行できます。lists.wikimedia.orgTelnet は、 (以下を参照)の 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ます。ソケット経由で手動で実行したい場合、他に何かする必要がありますか?

4

1 に答える 1

5

おそらく、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");
...
于 2013-04-17T19:55:27.037 に答える