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

Cuando trato de hacer la impresión de contenido en el interior "en", como a continuaciónjava impresión flujo de entrada a la consola el contenido

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

Por favor, muestre un ejemplo corto pero * completo *. No ha mostrado cómo está enviando la solicitud a Google. Si especifica que puede manejar datos gzip, por ejemplo, primero deberá descomprimir la salida. –

+0

(También tenga en cuenta que su código actual efectivamente está asumiendo ISO-Latin-1.) –

+0

hola, después de abrir el nuevo Socket(); Hago un "get index.html" y lo envío a "fuera" para tratar de obtener el "en" como el código anterior. No he especificado handle gzipped, ¿cómo saber si está comprimido? – cometta

Respuesta

18

Si desea imprimir el contenido de una página web, es necesario trabajar con el protocolo HTTP. Usted no tiene que aplicar por sí mismo, la mejor manera es utilizar las implementaciones existentes, tales como el API Java HttpURLConnection o Apache de HttpClient

Aquí está un ejemplo de cómo hacerlo con HttpURLConnection:

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. 

Como escrito anteriormente, puede guardar el tráfico al agregar el encabezado Aceptar codificación y verificar el encabezado Content-Encoding de la respuesta.

Este es un ejemplo HttpClient, tomada de 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 para el HttpClient en particular. Tan pronto como desee hacer algo más allá de un simple GET, es inestimable –

+2

HttpURLConnection no maneja contenido comprimido. Aprendí eso de la manera difícil. –

1

Si lo que para ir a buscar el contenido de una página web, usted debe echar un vistazo a apache httpclient en lugar de codificar esto por sí mismo, le espera con fines de aprendizaje o cualquier otra buena razón.

0

muy fácil de crear una cadena de una corriente utilizando Java 8 Corriente del API:

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

El uso de IntelliJ incluso de que pueda establecer este beeing una expresión de depuración: enter image description here

supongo que en Eclipse va a funcionar es similar

Cuestiones relacionadas