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 ..

 

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

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
Puedes usar   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.

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

 

Imagen de ezamudio

println

PrintWriter.println creo que ya incluye flush.