Depois de uma longe discussao numa lista, decidi copiar aqui tambem o que sei sobre chats, assim quem tiver duvidas do assunto vao saber onde perguntar, se nao solucionar o problema.
Um chat que se mantem no servidor implementado por servlets/jsp costuma possuir dois frames: o TEXTO (onde tem a barra de rolagem) e o FORMULARIO. O protocolo eh sempre HTTP claro.
O formulario pode usar o metodo POST/GET mas o metodo recomendado pode ser o PUT, uma vez que indica enviar algo para alterar uma pagina.
A diferenca cosmetica numa servlet sera qual metodo devera ser implementado, doGet, doPost ou doPut.
A servlet que recebe o formulario ira processar o request e devolver um novo formulario.
Pronto, a segunda parte esta pronta, falta a primeira parte/frame.
Ele eh feito atraves de uma outra/mesma servlet que NAO FECHA A CONEXAO COM O CLIENTE (exemplos: uol, terra). Algumas pessoas pensam que isso ira abusar de conexoes, porem eh a tecnica utilizada por todos os grandes chats. Fora dessa soh existe o metodo de reloads que nem irei comentar.
Desse jeito, essa servlet mantem uma lista com os streams de saida (OutputStream/Writer) e quem eh quem (esses chats sempre fazem aquele opcao de mandar mensagem privada para “Joca Maloca”).
Essa servlet ira dormir ate o usuario clicar STOP no browser (ira jogar uma excecao no codigo: stream fora fechada) ou fechar a janela (idem)… assim voce sabe que o usuario saiu da sala. Claro que voce pode criar um botao SAIR que tambem devera tirar o usuario da sala.
Por ultimo voce precisa fazer com que a cada nova mensagem na servlet que processa FORMULARIOS, essas sejam escritas nos usuarios que estao conectados na servlet de TEXTO (se nao for a mesma).
Para isso voce pode:
- para cada novo formulario, processar umvetor com uma lista de usuarios conectados e enviar a mensagem para cada Stream deles
- durante o sleep da servlet de TEXTO, checar se existe algo novo e jogar este novo no stream do usuario.
O primeiro metodo eh muito mais inteligente e rapido, apesar de efetuar uma conexao direta entre duas servlets (nao muito orientado a objeto), mas eh um problema que pode ser solucionado sem muita dor de cabeca.
Bom, eh isso, espero ter solucionado o problema daqueles que nao conseguem imaginar como fazer um chat sem tempos de reload…
Quaisquer duvidas, podem escrever
Guilherme Silveira