¿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);
- Android: Capturar imágenes y enviarlas a través de Socket a un applet
- Enviar y recibir datos a través de Bluetooth
- InputStream que es más rápido read () o read (byte, offset, length)
- ¿Cómo obtener el estado del mensaje leído / no leído usando XMPP Smack API?
- Aplicación de congelación de socket Android Bluetooth
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
- Javax.net.ssl.SSLException: No certificado de servidor de confianza
- Carga de datos desde la aplicación de Android al programa de escritorio
- GCM: cómo evitar el estrangulamiento
- InetAddress.getByName en Android
- Lea desde InputStream usando lectura contra IOUtils.copy
- Imprima un archivo PDF en una impresora usando PrintWriter a través de una conexión de socket
- Android: los sockets nativos no eliminan el modo de suspensión 3G en el primer intento
- Socket android DataOutputStream.writeUTF
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'.
- SimpleCursorAdapter de Android con consultas utilizando DISTINCT
- ¿Cuántas etiquetas de esquema y host pueden estar bajo el intento de filtro en android manifiesto?