Estou com um problema sério, criei um servidor em Java, conexão TCP e tenho um cliente em C, no entanto as vezes o pacote que o cliente me envia (apenas String) eu não recebo.
O cliente está rodando em uma plataforma linux embarcado e o servidor em um PC no Windows XP SP2.
Criei um cliente em java para realizar alguns testes, e não deu nenhum problema literalmente, agora estou forçando os testes, enviado dados a cada 100ms, e no momento já foram 4050 dados e todos respondidos sem enhum problema.
(Cliente envia “ATIVO” e servidor responde “OKATIVO”).
Será que esse problema que estou tendo é alguma incompatibilidade entre linguagens ou plataformas?
Desde já agradeço a ajuda que for prestada. Muito obrigado!
Segue a forma como estou tratando o que recebo. Estou usando ServerSocketChannel e SocketChannel
while (true) { // While que recebe constantemente os dados
ByteBuffer newData = ByteBuffer.allocate(100); // ByteBuffer para novos dados
novoCliente.read(newData); //Aguarda até um novo dados chegar
if (newData == null) {
System.out.println(">>>>> Cliente desconectou!!! DADO RECEBIDO É IGUAL A null <<<<<"); // DEBUG << ----------------------------------
closeCliente();
this.stop(); // Finaliza a Thread
} else {
//recebe dados e monta a string
int i = 0;
while (newData.getInt(i) != 0) {
char ASCII = (char) newData.get(i);
recept += ASCII;
i++;
} // Fim do While que monta a string recebida
...
}
Não, na minha concepção após o último caracter vai ter 0 ou -1 então ele finaliza, teria uma sugestão melhor? Pois no momento essa é a forma mais funcional que encontrei.
Eu sempre aconselho, se você for inventar seu próprio protocolo usando sockets TCP, a criá-lo orientado a mensagens.
No começo de cada mensagem, mande o tamanho (como um inteiro de 4 bytes, em “network byte order”) e depois os dados.
Então você, ao receber uma mensagem, lê o tamanho e depois espera ler o resto dos dados. Provavelmente os dados não virão todos de uma só vez, então você tem de ficar acumulando os dados até receber a mensagem completa.
Dê uma olhada num server bem estúpido (não usa NIO nem nada muito complicado) em:
Outra dúvida que tenho é a seguinte, qual seria a forma mais correta para saber quando o cliente desconectou de forma anormal, por exemplo, quando o cabo de rede for retirado.
Hoje eu tenho um timeout de 3 minutos, se caso eu não receber nada durante 3 minutos desconecto o cliente.
Não faça isso. Para mensagens pequenas e com intervalos de tempo grandes entre si, isso funciona. Entretanto, se a mensagem for grande, ela ficará fragmentada (isso porque o TCP/IP é assim; não há o que você possa fazer) e se as mensagens forem pequenas, mas sem intervalos de tempo muito grandes entre si, elas virão “grudadas”. Ainda peço encarecidamente para você ler meu código que postei.