Socket duvida qto ao flush()

Galera tenho uma dúvida sobre o envio de streams através de Sockets.

Por exemplo:

Servidor.java

public class Server{
(...)
                         System.out.println("SERVIDOR INICIADO");

			ServerSocket server = new ServerSocket(port);
			

			System.out.println("SERVIDOR ESPERANDO CONEXÕES");
			Socket socket = server.accept();
			System.out.println("SERVIDOR RECEBEU CONEXÃO");

			DataOutputStream out = new DataOutputStream(socket.getOutputStream());
			DataInputStream in = new DataInputStream(socket.getInputStream());

			String xml= "<?xml version=\"1.0\" encoding=\"utf-8\"?><tag1>Valor 1 RESPOSTA SERVIDOR</tag1></xml>";

			out.write(xml.getBytes("UTF-8"));
			out.flush();
			System.out.println("SERVIDOR EXECUTOU FLUSH");

			System.out.println("SERVIDOR ENVIOU XML");

			out.close();
			in.close();
			socket.close();

			System.out.println("SERVIDOR FINALIZADO");

(...)

}

Client.java

public class Client{
(...)

                        Socket socket = new Socket(host, port);

			System.out.println("CLIENTE INICIOU");

			DataOutputStream out = new DataOutputStream(socket.getOutputStream());
			InputStream in = socket.getInputStream();


			ByteArrayOutputStream bout = new ByteArrayOutputStream();
			int read = 0;

			while ((read = in.read()) != -1) {
				bout.write(read);
			}
			bout.flush();
			bout.close();

			String servidorXml = new String(bout.toByteArray(), "UTF-8");

			System.out.println("CLIENTE XML RECEBIDO");
			System.out.println(servidorXml);

			in.close();
			socket.close();

			System.out.println("CLIENTE FINALIZOU");
(...)
}

Ao iniciar o Server, ele fica aguardando conexões, quando recebe uma conexão ele envia o “XML” para o Client. Minha dúvida é, porque a String ocntendo o XML só chega realmente ao Server quando o socket é fechado, e não quando chamo o flush do OutPut ?

Valeu.

http://guj.com.br/java/136538-duvida-simples#735860

Deixa eu ver se entendi.

O cliente precisa saber a quantidade de bytes que deverá ser lido. Então meu cliente deverá ler o tamanho dos bytes, e posteriormente ler o restante.

Se eu ainda escrever algo no servidor, o cliente deverá fazer em qual byte ele parou, ou o Stream é “limpado”, e começa tudo novamente ?

É isso aí.

Só esclarecendo a dúvida: Existe um buffer no cliente. A medida que os dados chegam do servidor, se acumulam nesse buffer.
O read() lê o conteúdo do buffer. Nenhum dado será perdido durante a escrita do buffer.

O TCP garante que nada se perde ou mude de ordem durante a transmissão ou leitura.
Imagine o TCP como um canal contínuo de transmissão, onde cada byte enviado cedo ou tarde chegará no outro lado da conexão, na mesma ordem que foi enviado.

Quem deve criar a estrutura lógica desse canal, isso é, dizer que bytes correspondem a que informação é você, no seu protocolo. Por isso a necessidade de definir tipos de mensagens e tamanhos de transmissão.