2011-05-26 21 views
12

que estoy usando BufferedReader.readLine() método para leer una respuesta de un servidor remoto (que está escrito en C y no tengo acceso al código fuente).sockets: BufferedReader readLine (bloques)

BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
String line; 
while((line = br.readLine())!=null){ 
    [...] 
} 

Pero siempre bloquea en la última línea hasta que se agota el tiempo de espera. Por lo que utiliza el siguiente código:

int b; 
while(true){ 
    b = in.read; 
    [...] 
} 

y descubrí que el último byte leído tiene un valor entero de 13, que creo que es un retorno de carro, ¿verdad?

Entonces ¿por qué los bloques readLine método? ¿Cómo suele indicar el servidor que se llega al final del flujo? Gracias.

+0

Puede usted por favor pegue su código de no bloqueo que usa. Estoy buscando ver qué se puede hacer para las entradas sin bloqueo –

Respuesta

12

En el caso de una conexión de red, la corriente se termina cuando se cierra el socket.

lo que es perfectamente normal que readLine() bloques hasta que recibió un "fin de línea" o cerrar manualmente la conexión. Cuando su readLine() recibe el último carácter con el valor '13', la línea se lee y el ciclo comienza de nuevo, esperando la siguiente línea.

No hay diferencia entre la "última línea" y las otras líneas.

Con el fin de detener el bucle, debe cerrar manualmente la conexión de algún lugar o esperar a que el tiempo de espera. Pero sin más información sobre su protocolo de comunicación, es imposible ser más preciso al respecto.

+0

Tiene razón; el código espera \ r y luego recuerda omitir el siguiente avance de línea (si hay alguno). –

4

Depende del protocolo. Si el servidor no cierra la secuencia, readLine se bloqueará hasta que se reciba el final de línea adecuado. Entonces, si el servidor nunca envía el final de línea correcto, estás bloqueado. Debería tal vez usar más métodos de bajo nivel e intentar obtener la documentación del protocolo o realizar una ingeniería inversa.

1

asegurarse de que el código de servidor tiene out.println() en lugar de out.print()

1

Puede extender la condición, mientras que si no utilizar líneas vacías:

while((line = br.readLine())!=null && line.length() > 0) { 
    // ... 
} 
+1

sí, idea correcta. Otra cosa que puede hacer es usar una secuencia de char especial del final del mensaje. Declarar algo como 'EOM' = \ n \ n donde 'EOM' es EndOfMessage – BQuadra

+0

Excepto que readLine se bloqueará hasta que se detecte un final de línea o se cierre la secuencia. –