Вы не хотите закрывать OutputStream сокета, потому что сокет имеет только один OutputStream.
Похоже, вам просто нужно сбросить свой OutputStream после записи в него.
out.flush();
РЕДАКТИРОВАТЬ: Спасибо за дополнительную информацию. Если вы читаете сокет, как это, получатель должен знать, когда вы закончите писать. InputStream знает, что вы закончили писать, только если закрыли сокет.
Но поскольку вы уже заявили, что не можете закрыть сокет, вам нужен другой способ сообщить принимающей стороне, что вы закончили. Либо вам нужно использовать специальный тип потока, который знает о отправляемых данных, либо вам нужно заключить договор на запись / чтение соответствующего объема данных.
Вероятно, было бы проще всего отправить данные в виде объекта (используя ObjectOutputStream / ObjectInputStream - возможно, вам даже не нужно конвертировать в XML).
Если вам не нужны накладные расходы, связанные с потоками объектов, простое решение состоит в том, чтобы вычислить длину отправляемых данных и отправить это число непосредственно перед отправкой фактических данных. В этом случае вы можете использовать DataOutputStream / DataInputStream. Отправьте количество байтов для чтения, а затем данные. На принимающей стороне прочитайте число, затем прочитайте указанное количество байтов во временную переменную и передайте ее в DocumentBuilder.parse (InputStream).
На отправляющей стороне вы должны сделать это:
DataOutputStream out = new DataOutputStream(s.getOutputStream());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
XMLSerializer serializer = new XMLSerializer();
serializer.setOutputByteStream(baos);
tosend = WUTPClientWriter.createMessage100(projectid, cpuclock, cpunumber);
serializer.serialize(tosend);
out.writeInt(baos.size());
out.write(baos.toByteArray());
out.flush();
Затем на приемном конце вы делаете что-то вроде следующего:
DataInputStream in = new DataInputStream(s.getInputStream());
int len = in.readInt();
byte[] xml = new byte[len];
in.read(xml, 0, len);
Document doc = builder.parse(new ByteArrayInputStream(xml));