0

Webページをバイト単位で読み込もうとしましたが、Javaコンソールに常に「BadRequestError400」メッセージが返されます(コンソールにコンテンツを表示しています)。バイトコードを読み取ったことが原因で、修正する方法が見つかりませんでした。コードと結果は次のとおりです。

Socket s = new Socket(InetAddress.getByName(req.hostname), 80);
                    PrintWriter socketOut = new PrintWriter(s.getOutputStream());
                    socketOut.print("GET "+ req.url + "\n\n");
                    socketOut.flush();
                    BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));

                    StringBuffer buffer = new StringBuffer();
                    int data = in.read();
                    while (data != -1) {
                      char theChar = (char) data;
                      buffer.append(theChar);
                      data = in.read();
                    }
                    in.close();
                    byte[] result = buffer.toString().getBytes();
                    out.write(result);

結果には、不正なリクエストメッセージから始まるhtmlタグが含まれていますが、それらを削除したので、結果は次のようになります。

Thread with id 10 URL: http://www.facebook.com.tr/
Host: www.facebook.com.tr
HTTP/1.1 400 Bad Request
Content-Type: text/html
Date: Wed, 17 Oct 2012 10:18:06 GMT
Connection: close
Content-Length: 134

400 Bad Request
Method Not Implemented
Invalid method in request
4

3 に答える 3

0

最初のハンドシェイクで受け取った永続的なリダイレクトをコードが処理できないためだと思います。

$>> curl --head www.facebook.com.tr/
HTTP/1.1 301 Moved Permanently
Location: http://www.facebook.com/
Content-Type: text/html; charset=utf-8
X-FB-Debug: WOU3E4EGqo5Rxch8AnUzqcWg9CcM1p55pt1P9Wrm0QI=
Date: Wed, 17 Oct 2012 10:33:12 GMT
Connection: keep-alive
Content-Length: 0

質問も確認してください。これは 404 ではなく 400 です。

これを試して:

BufferedReader reader = new BufferedReader(new InputStreamReader(new URL("http://www.facebook.com.tr").openStream()));

String line = reader.readLine();
while(line!=null) {
    System.out.println(line);
    line = reader.readLine();
}
于 2012-10-17T10:34:16.247 に答える
0

エラー コード 400 は、HTTP サーバーに正しくない、または不適切な要求を送信した場合に、HTTP サービスに送信されます。あなたの要求が正しいかどうかを確認する必要があります。なるほどwww.facebook.com.tr。それを確認してください.tr

于 2012-10-17T10:36:03.033 に答える
0

サーバーは、宣言のない HTTP 要求を許容していませんHTTP-Version。次のようにしてみてください。

socketOut.print("GET "+ req.url + " HTTP/1.1\n\n");

data = in.read()また、サーバーが接続を維持しているため、ある時点でがメイン スレッドをロックすることも考慮してください。接続を切断するか、何か他のことをしない限り、接続がタイムアウトするまでループが終了するまでに時間がかかります。

于 2012-10-17T21:39:15.843 に答える