Казалось бы, unmarshaller задыхается от семантики выходного потока сокета. Я предполагаю, что он ожидает завершения потока, сигнализируя -1 для доступной длины, и блокирует чтение навсегда, когда вместо этого он получает 0. Хотя это может показаться хакерским, вы можете обойти эту проблему, используя промежуточные программы чтения / записи.
Вот пример, основанный на вашем коде, с использованием программы чтения / записи промежуточных строк:
Сервер:
final BufferedReader socketReader = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
final StringReader dataReader = new StringReader(socketReader.readLine());
JAXBContext requestContext = JAXBContext.newInstance(this.requestClass);
Unmarshaller unmarshaller = requestContext.createUnmarshaller();
@SuppressWarnings("unchecked")
K request = (K) unmarshaller.unmarshal(dataReader);
respond();
Клиент:
JAXBContext messageContext = JAXBContext.newInstance(message.getClass());
Marshaller marshaller = messageContext.createMarshaller();
final StringWriter dataWriter = new StringWriter();
marshaller.marshal(message, dataWriter);
out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
out.write(dataWriter.toString());
out.newLine();
out.flush();
waitForResponse();