Я думаю, что ваша ошибка в следующей строке:
byte[] data = new byte[in.available()];
Метод available()
возвращает только то количество байтов, которое сразу же доступно для чтения из входного потока, но вы используете его для инициализации размера временного байтового массива. Так как вполне возможно, что available () возвращает 0, возможно, вы инициализируете массив нулевой длины.
Было бы лучше просто инициализировать «данные» массивом фиксированной длины.