Enviar dois outputstream na mesma classe

Boa Noite!

Estou tentando resolver a seguinte situação no socket que criei para gravar dados no banco:

quando eu envio

output.print(“primeira informação\n”);
output.flush();

no próximo ele não executa, passando direto, por exemplo:

output.print(“segunda informação\n”);
output.flush();

mas se eu colocar o segundo envio em outra classe funciona normalmente.

Alguem sabe como posso colocar os dois na mesma classe?

Grato!

Cê não tá dando um output.close() depois do flush?

Tente fazer:

seuSocket.setTcpNoDelay(true);

O que acontece é que o TCP implementa o algoritmo de Nagle.

O que ele faz é agrupar mensagens muito pequenas num único pacote. E pode ser que sua segunda mensagem não seja enviada pq o TCP está esperando mais dados para agrupa-los. Isso foi criado para evitar que pacotes pequenos demais congestionassem a rede quando se usa o telnet.

Agora, lembre-se de uma regra muito importante com o TCP: Ele é orientado a fluxo, não a pacotes.

Portanto, apesar do número de bytes lidos e escrito ser o mesmo, o número de vezes que você lê pode não ter qualquer relação com o número de vezes que você escreve. Ou seja, é possível que vc envie a 2 mensagens com dois write e receba as duas em um único read. Ou então, vc pode enviar uma mensagem grande com um único write, e ter que recebe-la com dois reads. Alguns streams tem um controle pequeno sobre isso, mas o ideal seria vc implementar o seu próprio protocolo.

Rafael, não há close, apenas flush na classe.

ViniGodoy, obrigado pela explicação. No caso eu dependo da primeira informação para o envio da segunda, tem alguma maneira de amenizar esse problema de excesso de fluxo e como ser na mesma classe(arquivo).

Grato!

O problema não tem absolutamente nada a ver com a classe ou o arquivo em que o seu socket está.
Você tentou definir a propriedade que eu falei ali e cima? Isso já deveria adiantar.

ViniGodoy, desculpe pela falta de atenção. Coloquei a instrução que você passou, mesmo assim ele não executou o segundo. Quando coloco em outro arquivo classe ele funciona.

Você tem certeza que ele não enviou? Não pode ter sido o outro lado que não recebeu?

Use o Wireshark para ver certinho o que está trafegando na rede.

ViniGodoy, realmente ele não está executando, mas farei novos testes, me esclarece outra dúvida, dentro de cada classe em que foi aberto um output.print(""); eu preciso chamar o output.close(); no final da classe e, caso precise, ainda tenho que chamar o output.flush(); antes, pois estou percebendo várias conexões locais no estado CLOSE_WAIT, me corrija se estiver errado.

Grato!

É isso mesmo. Certifique-se inclusive de que os códigos de flush() e close() estão dentro do seu finally.