Ver Mensaje Individual
  #3 (permalink)  
Antiguo 31/10/2007, 10:18
yartax
 
Fecha de Ingreso: abril-2006
Mensajes: 76
Antigüedad: 18 años
Puntos: 0
Re: DataInputStream read

No me acaba de ir bien esta solución y he modificado la forma de leer los datos. Ahora leo todos los datos a nivel de byte. Te pongo otro ejemplo a ver si damos en el clavo.

Tengo un clase con un ServerSocket que espera una connexión y al recibirla crea un thread para atender al cliente. Para leer la petición HTTP del cliente realizo el siguiente codigo:

/* Creamos streams de connexión */
socket_cliente.setSoTimeout( TIMEOUT_LECTURA_CLIENT );
in = new DataInputStream( socket_cliente.getInputStream() );

Ahora leo los datos en un bucle:

private boolean leer_peticion( )
{

byte actual = 0;
byte anterior = 0;
while ( true )
{
byte[] linea = new byte[ MAX_STRING ];
int i = 0;
try
{
while ( ( anterior != CR ) && ( actual != LF ) )
{
anterior = actual;
actual = in.readByte();
linea[i++] = actual;
}
String campo = new String( linea , 0 , i-2 );
peticion.AddHeader( campo );
anterior = actual = 0;
}
catch ( EOFException e)
{
break;
}
catch ( IOException e )
{
System.err.println("Error:" + e.getMessage() );
break;
}
}
return true;
}

Como se puede ver entro en un bucle infinito (dentro de un hilo), hasta que leo todos los datos. El problema que tengo es que siempre salgo del bucle por timeout, nunca porque la función readByte() me devuelve EOFException que seria lo normal. Los datos los leo perfectamente, pero tengo que esperar siempre el timeout en lugar del EOF y no se porque. He comprobado que leo todos los bytes perfectamente uno a uno, pero en teoria al hacer un readByte() tocaria lanzar una exception EOF pero no la suelta y tampoco entrega ningun dato. Estoy un poco perdido. Si no realizo establezco un timeout de lectura, se me queda el hilo estancado en la funcion getBytes esperando nuevos datos, que nunca llengan claro.

Y esto mismo me pasa con la conexion que realizo al servidor. Pero este caso es mas simple de entender por no copiar todo el codigo.

Gracias por la ayuda.
Saludos.