Не могу понять причину потери байтов в процессе передачи данных между клиентом и сервером, кто может помочь?
Метод read не обязан отдавать столько, сколько просишь. Он возвращает количество реально прочитанных байт (один и больше) или -1, если данные кончились. Читайте в буфер в цикле. Раз там строка - в StringBuilder.
Если предполагается работа только со строками, то попробуйте использовать методы readUTF для чтения потока и writeUTF для передачи данных в поток, передавая им строки напрямую. В сочетании с DataOutputStream и DataInputStream.spoiler
Чтение:DataInputStream in = new DataInputStream(socket.getInputStream());
            String msg = in.readUTF();
Запись:DataOutputStream out = new DataOutputStream(socket.getOutputStream());
           out.writeUTF(msg);
           out.flush();