¿Cómo leer la respuesta HTTP a través de sockets?

Estoy intentando crear un servidor proxy http en el dispositivo android. Cuando intento leer la respuesta del servidor HTTP (example1.com) (example1.com contiene la longitud del contenido en el encabezado) Si el servidor HTTP contiene el contenido de la longitud, entonces estoy leyendo los bytes desde el contenido de la longitud más que se leen todos los bytes de respuesta

byte[] bytes = IOUtils.toByteArray(inFromServer);

El problema es que, cuando la respuesta contiene content-length la respuesta se lee rápidamente. Si la respuesta no contiene content-length del content-length la respuesta se lee lentamente.

Este mi código

 DataInputStream in = new DataInputStream(inFromServer); //BufferedReader br = new BufferedReader(new InputStreamReader(in)); String line = ""; String str = ""; Integer len = 0; while(true) { line = in.readLine(); if (line.indexOf("Content-Length") != -1) { len = Integer.parseInt( line.split("\\D+")[1] ); //System.out.println("LINEE="+len); } out.println(line); str = str + line + '\n'; if(line.isEmpty()) break; } int i = Integer.valueOf(len); String body= ""; System.out.println("i="+i); if (i>0) { byte[] buf = new byte[i]; in.readFully(buf); out.write(buf); for (byte b:buf) { body = body + (char)b; } }else{ byte[] bytes = IOUtils.toByteArray(inFromServer); out.write(bytes); } 

Out – outStream al navegador

Pruebe el siguiente código:

 // Get server response int responseCode = connection.getResponseCode(); if (responseCode == 200) { BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line; StringBuilder builder = new StringBuilder(); while ((line = reader.readLine()) != null) { builder.append(line); } String response = builder.toString() // Handle response... } 

En primer lugar, usted debe saber qué http protocal y cómo funciona.

Y cada http Solicitar como:

  • Línea de solicitud
  • Encabezado de solicitud
  • Linea en blanco
  • Órgano de solicitud.

Y cada respuesta http como:

  • Línea de estado
  • Encabezado de respuesta
  • Linea en blanco
  • Cuerpo de Respuesta.

Sin embargo, podemos leer el InputStream desde el servidor http, podemos dividir cada línea que leemos desde el final de inputtream con '/ r / n'.

Y su código:

 while(true) { **line = in.readLine();** if (line.indexOf("Content-Length") != -1) { len = Integer.parseInt( line.split("\\D+")[1] ); //System.out.println("LINEE="+len); } out.println(line); str = str + line + '\n'; if(line.isEmpty()) break; } } 

Y in.readLine () devuelve cada línea no termina con '/ r / n', devuelve el final de la línea con '/ r' o '/ n'. Tal vez lea el bloque inputtream aquí .

Aquí hay un IOStreamUtils para leer el final de línea con '/ r / n'.

https://github.com/mayubao/KuaiChuan/blob/master/app/src/main/java/io/github/mayubao/kuaichuan/micro_server/IOStreamUtils.java

  • Cómo importar el formato android.os.bundle en proyectos normales de java?
  • Cómo acceder a Android desde el navegador
  • ¿Debo usar GCM para la comunicación en tiempo real entre dispositivos?
  • No se puede establecer el valor DSCP en la aplicación android
  • RDP a través de Bluetooth
  • Lo que puede causar un error socket () "Permiso denegado"?
  • Cierre el zócalo al terminar la aplicación
  • Aplicación de Android: permiso de SocketException denegado (ningún archivo o directorio de este tipo)
  • Problema con el archivo de envío de Bluetooth de Android
  • Tiempo y cancelación de socket
  • Android - no se pudo instalar * smartsocket * listener
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.