Cette méthode de réception ne tiens aucunement compte du nombre d'octets disponibles dans le buffer de réception.
Tu dois absolument faire des vérifications sur la taille des données, ta méthode n'est autrement pas correcte du tout :
1) si taille dispo > 2 -> lire header, sinon attendre
2) si taille dispo > taille de la taille -> lire la taille, sinon attendre
3) si taille dispo > taille données lues à l'étape 2 -> lire les données, sinon attendre
Ce qui se passe ici c'est que la taille des données est supérieure à la taille des données reçues, donc tu ne peux pas reconstituer le message dans son intégrité. Il te faut absolument attendre d'avoir toutes les données disponibles.