TCC- Ajuda dos grandes -Chat web - AJAX

Pessoal estou numa pesquisa para o meu pre-projeto de TCC. Preciso de uma ajuda dos grandes conhecedores de informação e tecnologia, galera do GUJ.

Em resumo quero implementar um CHAT WEB.
COMO O BATE PAPO UOL FUNCIONA?
Por ex …
Eis que que maioria das implementações de chat que sempre vi sugerirem, foi sempre o cliente ficar OUVINDO de tempo em tempo.
Com uma Thread ficar perguntando ao servidor se tem alguma coisa nova. Nao é ?

As implementações que vi eram sempre o cliente realizando chamadas ao servidor…
O QUE EU QUERO … ???
Eu gostaria de implementar meu chat WEB… fazendo com que O SERVIDOR AVISE OS CLIENTES a cada mensagem falada no chat.
Então somente teria fluxo quando realmente necessário. Quando alguem fala. Se ninguem fala nada, não ha motivos para que o cliente fique perguntando a toda hora.

Como por ex o bate papo uol funciona? sera que fica a cada segundo fazendo requisições ao servidor pra ver se alguem falou alguma coisa naquela sala ? ou será que ele consegue implementar esta forma de avisar quando alguem fala ?

EIS Q RESPOSTA QUE EU QUERO… eu quero uma forma de avisar o meu cliente HTTP de que alguma coisa aconteceu… realizar chamadas aos clientes conectados…

Eu consigo fazer isto com desktop, utilizadno ou RMI ou xml-rpc , onde meus clientes também viram servidores, e o meu servidor armazena referencias para estes “clientes-servidores” e consegue realizar chamadas a eles quando uma ação ocorre.

E web… como eu faria? tem como? ja existe algo implementado em alguma linguagem? ja existe algo em JAVA ?

A minha intenção é fazer o servidor em JAVA e o cliente em JAVA (JSP ou APPLET) OU FLEX … TALVEZ AMBOS COM AJAX… N SEI…
Ideias? Opinioes? Sugestoes?
OBRIGADO.

Tranformar o cliente WEB em servidor nao vai ser possivel nao…

O cliente tem que fazer uma requisicao primeiro mesmo…

Então o cliente pode fazer uma requisicao e o servidor segurar essa requisicao… até que tenha mensagem nova… o servidor entao libera a resposta com as novas mensagens… (funciona melhor com AJAX isso)

O problema é o seguinte: Vao haver milhares de requisicoes de clientes esperando no servidor até que ele responda… consumindo muitos recursos

Uma da funcionalidades do JEE 6 é a chamada assincrona… onde o servidor pode segurar uma requisicao sem consumir muitos recursos… acho que essa chamada assincrona é interessante de ser abordada no seu TCC… e inclusive é um assunto novo…

Até mais

Entao uma requisição eu sei que o cliente tem que fazer, seria a entrada no chat.
Tava eu pensando em algo do tipo, de armazenar os HTTPRequest no servidor… e quando chegar uma HTTPRequeste de “fala” eu dava uma response pra todo mundo com esta fala, e ao receber essa response o cliente ia mandar denovo o Request, pra escutar… ate que alguem fale…

Mas digamos que fizesse assim, como o cliente iria mandar uma mensagem, sendo que ele esta esperando uma resposta?
o AJAX, faz varias requests?

Vou dar uma lida sobre a chamada Asssincrona, obrigado.
Tou louco para que apareceça um especialista em FLEX, por aqui pra dar uma opiniao/sugestao.

Eu ia até comentar que talvez fosse possível fazer no flex… (eu nao conheço)

Mas nao é possível pelo mesmo motivo do html + http normal… isso seria uma falha de segurança…

Imagine um site usando flex… vai lá e abre uma porta no seu computador!!! Seria uma das falhas mais graves…

(Mas vamos aguardar o especialista)

Voce pode fazer várias chamadas com o AJAX…

Aí nao tem problema vc estar esperando uma resposta do servidor…

o AJAX é uma chamada assincrona…

mas no JEE 6 também tem a chamada de servlet assincrona… que é outra coisa… mas que complementa o seu problema…

(tipo… tem como fazer um ajax e no servidor ser sincrono… mas no seu caso é bom os dois serem assincronos)

sobre haver milhares de requisições armazenadas no servidor, na verdade é bem isso que eu iria querer…
pelo menos eu sei que tem e quem sao os milhares de clientes conectados a min.

Tava pensando tbm, se nao tiver como fazer web, fazer um applet abrir uma conexao por ex com socket… pra o meu servidor saber que este “cliente” ta conectado…
mas isso como voce comentou poderia ser uma falha de segurança …

A ideia do meu orientador é que eu prourasse por fazer/pesquisar o cliente com FLEX+AJAX.

Esse TCC vai da pano pra manga.

As milhares de requisicoes no servidor… voce terá de qualquer jeito…

Mas com as chamadas assincronas… vc nao gasta tantos recursos do servidor

Por exemplo… cada requisicao é feito em uma thread…

Se tiver mil requisicoes vai precisar de mil threads…e o número de threads é limitado…

Além de ter mil threads… vc vai ter mil threads esperando… o que é esperdicio de recursos…

Entao com o servlet assincrono… vc consegue ter as mil requisicoes armazenadas sem gastar as mil threads…

No caso do Applet… dá pra fazer o cliente fazer uma conexao com o servidor… e aí com algum controle dá pra vc só receber os dados quando o servidor quiser mandar…

Mas a requisicao sempre tem que vir do cliente…

mas entao, essa conexao com o servidor…no caso de applet
eu n poderia criar um XMl-RPC Server ? e enviar o meu endereço pra que o servidor possa chmar com um XML-RPC Client …
ou Socket… ou rmi…
Mas rmi é meio chato… melhor socket ou ainda XML-RPC q vai rodar como HTTP.

tou procurando a solução web direito no HTTP REQUEST RESPONSE.
pra ver se descarto essa opção de abrir uma conexao com o servidor…
ja seria uma conexao o proprio browser…

Cara, trabalhei um tempo com um protocolo muito bom chamado "JABBER’.

Este protocolo é o mesmo usado em aplicaçoes distribuidas por empresas como a Google.

Para completar, existe uma empresa que fabrica um servidor baseado em jabber chamado “OPENFIRE”.
Este servidor é feito todo em JAVA (uma maravilha da ciencia moderna :P).

Dá uma checada na documentação e no site:

http://www.igniterealtime.org/projects/openfire/

Quem sabe não surge coisas como um novo plugin para o OpenFire feito por vc.

Tem muito pano pra manga mesmo!!!

E mais, ainda tem o lance de trabalhar em um projeto direto e com uma aceitação no mercado muito boa.

Só complementando, o mercado utiliza este servidor, pois nele, contém o que se diz de “Gateways”, ou clientes dos mais diversos nichos tecnologicos, ou seja, vc pode trabalhar com este servidor juntamente com um cliente feito por vc, e ainda ter suporte a outros cliente como o GTALK, MSN, ICQ, Yahoo MS, e outros.

Uma boa sacada não é.

Falow é issso.

Espero ter ajudado.

[]'s.

Fazer um chat WEB com Flex é super tranquilo.
Se você utiliza Java + BlazeDS.

Basicamente assim:

É só você configurar um channel de messaging.E na sua app criar um Consumer (que vai receber as chamadas) e um Producer (que vai mandar chamadas)

Então toda vez que mandar uma mensagem você manda pelo Producer que todos os outros Consumer vão receber ela.

Se você quiser montar salas diferentes no chat pode usar subtopic, que somente os consumers que estiverem no mesmo subtopic que você receberão a mensagem.

Se quiser mais informações, pesquise sobre messaging + BlazeDS, subtopic…

Alguma coisa tem aqui:

http://learn.adobe.com/wiki/display/Flex/Creating+a+BlazeDS+messaging+application+in+Flex+Builder

Opa, Diego valeu a dica, vou dar uma pesquisada nisso e ver como funciona o Jabber e o OpenFire :slight_smile:
Rafael voce poderia me explicar melhor, eu ainda não iniciei no mundo Flex, tudo que sei é o pouco que andei lendo na web. Vou me aprofundar se eu decidir mesmo usar o flex.

Queria saber se em ambos rafael e diego, eu conseguiria implementar ações de um jogo depois…? Na verdade não é muito diferente do chat, é so fazer chamadas a métodos do servidor passando alguns parametros, e o servidor replica a ação para os demais jogadores.

@Fernando

Você quer fazer esse chat estilo alguns MMORPG?
O principal seria o jogo, mas também teria um chat embutido isso?

Então aconselho a estudar algo diretamente por sockets.

Rafael, Vamos imaginar um jogo basico, o xadrez.
Imagine que tenhamos uma tela de login. Voce loga e entao vai a uma tela contendo um chat.
A esquerda voce ve todos os jogadores logados, a direita o chat geral, onde todos falam.

Abaixo uma lista de salas/jogos …
A partir de uma sala cria-se um jogo.
Entao voce cria uma sala e ja entra, e dai tem opção de um outro jogador clicar nesta sala e entrar.
Entao sao dois jogadores. Eles estao dentro da sala e ja um chat para esta sala.
Eles iniciam o jogo. A sala passa a conter um jogo com os dois jogadores.
Eis que tenho o cenario basico do jogo de xadrez… vez de um, vez de outro…
e abaixo temos um chat, para os dois se comunicarem.

Para ficar interessante, colocamos que visitantes podem entrar no jogo. Podem ler o char e interagir. E assistem as jogadas.
Entao temos ai um servidor/clientes. Digamos que seja desktop.

Normalmente quando acontecessem jogadas ou falas seriam mandadas ao servidor, e os clientes estariam rodando em uma thread a cada 500ms, perguntando ao servidor se houve uma jogada ou fala no chat.

Bom, na minha visão, quando um jogador executa uma jogada ou fala, ela deveria ser enviada ao servidor. e o servidor replica a ação para os dois jogadores e os N espectadores conectados.
Literalmente avisando-os desta ação, através de uma chamada remota.

Para implementar isto eu utilizei RMI, onde quando o cliente se conecta so servidor, ele também starta um servidor … o “cliente-servidor” e o meu server tem conhecimento de todos os conectados para poder “chama-los” depois.

O que eu quero…
Realizar o jogo de xadrez na web, não desktop. O servidor continua, mas é acessado digamos por HTTP. e um mini-cliente rodado dentro do browser.
O meu cliente consegue realizar requests ao servidor, mas o servidor “ate entao/basicamente/normalmente” não consegue realizar chamadas aos clientes/browser que estão conectados a eles.
O servidor apenas responde as requisições de um cliente.

Com as explicações iniciais e agora um pouco mais do contexto. Acredito que de pra ter uma noção do que estou querendo.

“lembrando que, o que eu quero é avisar os clientes da minha aplicação que ações ocorrem, como a entrada de um novo jogador no chat, uma fala, uma sala criada, uma ação no jogo, sendo o cliente WEB, e sem o uso de threads”

E esse jogo de xadrez seria desenvolvido na web em Flash ou Applet?

Eis que esta, tenho que definir a parte cliente. pode ser em applet ou FLEX+BLASEDS … não precisaria ser em flash, pq nao vai ter animações.
é muita coisa pra estudar, e meu tempo é curto… so das 18 as 23 … :frowning: mas eu vo conseguir :slight_smile:

Jogo de Xadrez usando Flex acho que não seria o mais recomendado, mas…
vai do que você achar melhor.

Não conheço muito da parte grafica do FLEX, gostaria de saber e aprender. Dizem que é mais leve e bonitinho do que se eu fizer um applet.
Mas talvez o FLEX ajude a implementar essa chamada ao cliente.

Boas gente da boa…
Andei pesquisando…
to meio de vagar mas to indo …

Alguem sabe me dizer mais sobre SERVER/CLIENTE COM TOMCAT OU JBOOS
Andei assuntando e me disseram que quando o cliente faz uma requisição http ao servidor.
o tomcat ou o jboos mantem uma referencia do socket que conectou a ele …

Gostaria de mais informações. se isos é de fato mesmo… se algume ja mecheu,
All Help is Welcome.

aproveitando o embalo… to com meu tcc… e preciso de uma maneira nativa de converter imagens em png,bmp e tiff…
alguem sabe como funciona o algoritimo?
implementações prontas não me adiantam nada preciso do algoritimo… da teoria para isto…