Sinal EOF ou EOT com sockets

Ola galera.

Hoje não vim perguntar nada, mas contribuir com a solução de uma dúvida que me atormentou por meses.

Quando trabalhamos com sockets, ao comunicar-se com outros serviços e servidors, 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 idéia 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 interessante … vou guardar nos meus favoritos.

[]'s

Valeu! Abraço.