2009-07-05 15 views
14
sock = new Socket("www.google.com", 80); 
     out = new BufferedOutputStream(sock.getOutputStream()); 
     in = new BufferedInputStream(sock.getInputStream()); 

zu trösten Wenn ich versuche, innerhalb von Inhalt zu tun Druck „in“ wie untenjava Input drucken den Inhalt

BufferedInputStream bin = new BufferedInputStream(in); 
int b; 
while ((b = bin.read()) != -1) 
{ 

    char c = (char)b;   

    System.err.print(""+(char)b); //This prints out content that is unreadable. 
            //Isn't it supposed to print out html tag? 
} 
+0

Bitte zeigen Sie ein kurzes, aber * vollständiges * Beispiel. Sie haben nicht angegeben, wie Sie Google die Anfrage senden. Wenn Sie beispielsweise angeben, dass Sie mit gezippten Daten umgehen können, müssen Sie zuerst die Ausgabe dekomprimieren. –

+0

(Beachten Sie auch, dass Ihr aktueller Code effektiv ISO-Latin-1 annimmt.) –

+0

hi, nachdem ich den neuen Socket() geöffnet habe; Ich mache ein "get index.html" und sende es an "out", indem ich versuche, das "in" wie den Code oben zu bekommen. Ich habe nicht angegeben, griff gezippt, wie Sie herausfinden, ob es gezippt ist? – cometta

Antwort

18

Wenn Sie den Inhalt einer Web-Seite ausdrucken möchten, müssen Sie arbeiten mit dem Protokoll HTTP. Sie müssen es sich nicht realisieren, ist die beste Art und Weise ist es, bestehende Implementierungen zu verwenden, wie zum Beispiel die Java-API HttpURLConnection oder Apache HttpClient

Hier ist ein Beispiel dafür, wie es mit HttpURLConnection zu tun:

URL url = new URL("http","www.google.com"); 
HttpURLConnection urlc = (HttpURLConnection)url.openConnection(); 
urlc.setAllowUserInteraction(false); 
urlc.setDoInput(true); 
urlc.setDoOutput(false); 
urlc.setUseCaches(true); 
urlc.setRequestMethod("GET"); 
urlc.connect(); 
// check you have received an status code 200 to indicate OK 
// get the encoding from the Content-Type header 
BufferedReader in = new BufferedReader(new InputStreamReader(urlc.getInputStream())); 
String line = null; 
while((line = in.readLine()) != null) { 
    System.out.println(line); 
} 

// close sockets, handle errors, etc. 

Wie Wie oben beschrieben, können Sie Datenverkehr speichern, indem Sie den Accept-Encoding-Header hinzufügen und den Header Content-Encoding der Antwort überprüfen. Hier

ist ein Httpclient Beispiel, genommen von here:

// Create an instance of HttpClient. 
    HttpClient client = new HttpClient(); 

    // Create a method instance. 
    GetMethod method = new GetMethod(url); 

    // Provide custom retry handler is necessary 
    method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, 
      new DefaultHttpMethodRetryHandler(3, false)); 

    try { 
     // Execute the method. 
     int statusCode = client.executeMethod(method); 

     if (statusCode != HttpStatus.SC_OK) { 
     System.err.println("Method failed: " + method.getStatusLine()); 
     } 

     // Read the response body. 
     byte[] responseBody = method.getResponseBody(); 

     // Deal with the response. 
     // Use caution: ensure correct character encoding and is not binary data 
     System.out.println(new String(responseBody)); 

    } catch (HttpException e) { 
     System.err.println("Fatal protocol violation: " + e.getMessage()); 
     e.printStackTrace(); 
    } catch (IOException e) { 
     System.err.println("Fatal transport error: " + e.getMessage()); 
     e.printStackTrace(); 
    } finally { 
     // Release the connection. 
     method.releaseConnection(); 
    } 
+0

+1 für den HttpClient im Besonderen. Sobald Sie etwas über ein einfaches GET hinaus tun wollen, ist es von unschätzbarem Wert –

+2

HttpURLConnection behandelt nicht gezippten Inhalt. Das habe ich auf die harte Tour gelernt. –

1

Wenn Sie, was der Inhalt einer Webseite zu holen, Sie einen Blick auf apache httpclient stattdessen diese Codierung selbst übernehmen sollte, erwarten zu Lernzwecken oder jeden anderen wirklich guten Grund.

0

Sehr einfach einen String aus einem Stream mit Java 8 Stream-API zu erstellen:

new BufferedReader(new InputStreamReader(in)).lines().collect(Collectors.joining("\n")) 

Mit IntelliJ Ich kann sogar einstellen dies einen Debug-Ausdruck beeing: enter image description here

ich in Eclipse erraten arbeiten es ähnlich.