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.