Olá galera.
Hoje vim contribuir com a solução de uma dúvida que me atormentou por meses.
Esta dica não é necessariamente sobre
Java, mas para qualquer linguagem que trabalhe com Bytes e sockets para comunicação em rede.
Quando trabalhamos com sockets, ao comunicar-se com outros serviços e servidores, geralmente existe a necessidade de comunicar a outra ponta do fim da transmissão, porém, sem fechar o socket ou canal de comunicação.
Eu pesquisei isso by
Google e em diversos fóruns (guj, stackoverflow, coderanch, exampledepot e vários outros) por +/- dois meses e nada, muitos disseram que não tinha como representar isso.
O mais próximo que cheguei foi um artigo na
Wikipedia, falando sobre EOT (que seria 0x04), mas não funciona.
Bom, eu pensei, se navegadores e proxys conseguem isso, TEM que existir uma forma. Então, tive a ideia de construir um servidor para ficar 'escutando' conexões de navegadores e analisando o conteúdo, Byte por Byte.
Após um bom trabalho de análise nos Bytes, eu descobri. E agora venho compartilhar com vocês.
O sinal EOF ou EOT (não sei qual é o correto para esse caso) é: 0x0d0a
Só isso!
Até agora testei com navegadores, servidor proxy
Squid e servidor Web
Tomcat, e todos entendem que terminei de transmitir e a conexão permanece aberta.
Para enviar esse sinal através do socket, precisamos converter em Bytes, então:
int eof = 0x0d0a;
byte[] bs = new byte[2];
bs[0] = (byte) (eof >> 8);
bs[1] = (byte) (0x00ff & eof);
socket.getOutputStream().write(bs);
socket.getOutputStream().flush();
Abraço, espero que ajude.
Dica previamente publicada em:
Nenhum comentário foi encontrado.