comportamiento erratico
estoy revisando el siguiente codigo que es un socket que algunas veces se comporta de manera erratica, como que la trama que le llega de respuesta la corta no llega completa ..
- hackchan's blog
- Inicie sesión o regístrese para enviar comentarios
buffered streams
Dos cosas:
Envuelve los streams del socket en buffered streams para evitar esas broncas.
Después de escribir un mensaje completo, dale
al output stream.
InputStream.available regresa
InputStream.available regresa la cantidad de bytes que se pueden leer de jalón, pero no el total, entonces si tu total es por ejemplo 2,000 y tu llamada regresó 1024 te van a quedar 976 bytes sin leer, porque solo les la cantidad reportada.
Si estás leyendo la respuesta de un servidor HTTP puedes leer hasta obtener -1. Si estás leyendo un protocolo propio ese protocolo debe de indicar cuando termina el mensaje, ya sea regresando un número mágico ( como -1 en HTTP ) o indicando la longitud del mensaje en el primer valor del paquete.
Aquí está un ejemplo de como leer HTTP hasta encontrar -1
para cerrar automáticamente el socket y los streams y dejar el manejo de timeout al socket en vez de intentar manejarlo con un while.
Puedes usar
inputStream tiene un método para leer más de un byte a la vez, es muchísimo más rápido, lo escribiendo en un arreglo la cantidad de bytes que le indiques y te dice cuantos leyó ( si tu arreglo mide 1024 y leyó 10, te dice que leyó 10)
mejora v1
println
PrintWriter.println creo que ya incluye flush.