Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

CappiLevi

Criação de um sistema de chat: planejamento, idéias...

Recommended Posts

Olá pessoal, sou o dono do Tudoaki e confesso que faz tempo que não entro aqui no fórum do Imasters... Bom, desta vez pretendo fazer um sistema de chat para o site, para que os utilizadores possam trocar mensagens em tempo real com outros utilizadores online. Bom, no momento só tenho algumas anotações, idéias e dúvidas que gostaria de partilhar convosco.

 

Dúvidas:

 

- sobre o banco de dados... é obrigatório ter um? Por exemplo, eu poderia utilizar mysql, ou um documento de texto (.txt) e guardar lá as mensagens com fopen etc... mas não há como fazer o chat só utilizando sessões?

 

- sobre o funcionamento... bom, um sistema de chat seria algo do tipo, atualizações em tempo real das mensagens digitadas?, ou seja, tenho de utilizar por exemplo Ajax para atualizar a página de x em x milisegundos de modo a que se aproxime ao máximo de um sistema em tempo real? É assim que funciona por trás?

 

- bom, agora de uma maneira menos generalizada, ou seja, mais voltada ao meu caso mesmo... o que eu penso em fazer é algo do gênero, 2 utilizadores ao fazerem login no site, e verem o outro online, teria uma espécie de ícone na parte superior do site, que ao clicar abrirá uma janelinha de chat, que pode ser um div por exemplo... mas isso é mais pra frente, mais a parte gráfica.

 

Finzalizando...

 

o que eu preciso mesmo é esclarecer estas dúvidas sobre o funcionamento de um chat, porque como todo programador sabe, um bom projeto para ficar bem feito tem de haver um planeamento antes. Outra coisa... em relação aos meus conhecimentos, para que já fique claro o que eu sei e o que eu não sei... bom, sei trabalhar em javascript, php, mysql, css, html é claro, um pouco de ajax e tenho mais ou menos 5 anos de experiência em programação e construções de sites..

 

Bom, espero que vocês partilhem as vossas opiniões, idéias, críticas.. estarei a espera.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara eu já não tenho muita experiência em sites, mais em sistemas, mais umas idéias para o seu chat é que inves do arquivo de texto seria bom guardar as conversas em um banco de dados, informação hoje em dia é tudo, se você não gravar pode ocorrer algo um dia no seu chat que você irá se arrepender de não ter tudo gravado, e também, na criação recomendo mais você com o uso da jquery, porque ela oferece MUITAS classes prontas que você iria demorar semanas para desenvolver com ajax, e a lógica é aquela básica, uma pagina para entrar com um apelido, cor de fonte um no máximo um m ou f para saberem se é homen ou mulher, ai quando loga você cria o sistema de conversasão, colocar uma segurança, diversas salas, limitar as salas por no máximo 30 usuários e tal, que nem há em alguns chats, mais acho bacana você começar com um chat simples e colocar no ar, se der certo, ai você cria um mais sofisticado com diversas salas, limitadas por gêneros e etc.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiramente agradeço pela resposta João Vitor, você foi o primeiro. Desde ontem que esperava uma resposta, mas ninguém mostrou interesse no meu tópico. Como ninguém havia respondido comecei a desenvolver o sistema sozinho e ele já até funciona, faltando apenas alguns acabamentos...

Mas agora vamos lá ao que interessa...

 

Em relação a guardar num banco de dados... Bom, eu pensei nisso e cheguei à conclusão que não precisarei de um banco de dados mysql neste caso. Isso porque eu queria mesmo evitar o uso de um banco de dados mysql para não sobrecarregá-lo. Porque basta imaginar centenas de pessoas fazendo consultas ao mysql ao mesmo tempo... ainda mais com refresh de página com Ajax... Por isso, opitei por um documento de texto mesmo. Além disso eu não quero salvar as mensagens deste sistema de chat porque é algo simples, só para trocar umas idéias com outro usuário online mesmo. Não acho necessário salvar as conversas. Em relação à Jquery também não pretendo utilizar porque como eu disse, é um sisteminha simples. Já utilizei Jquery para outros sistemas mais complexos no site, mas para este não pretendo utilizar. Outra coisa importante é que não pretendo adicionar salas de chat no momento. Porque como eu disse, é um sistema para trocar mensagens com outro usuário apenas, pelo menos por enquanto... mais pra frente posso pensar se criar salas será uma boa ideia para o sistema... mas por agora não.

 

O sistema vai funcionar da seguinte maneira: cada usuário no meu site tem um perfil, tem também uma lista de usuários logados, sistema de correio eletronico, etc... ou seja, não vai ser difícil de localizar um usuário no site, para então iniciar uma conversa, então quando outro usuário quiser falar com tal pessoa online, ele clica num ícone qualquer e abre uma janelinha de chat no canto inferior direito para então trocarem mensagens em tempo real.

 

Veja como está ficando:

 

Imagem Postada

 

Bom, a principal parte eu já fiz, como podem ver na imagem acima.

 

Vou explicar como funciona. Quando o usuário faz login no site, tem lá um ícone chamado "Meu Chat", que ao clicar abre esta tal janelinha de chat, que neste momento é global, ou seja, é como se fosse uma única sala de chat, onde qualquer usuário que estiver logado na conta pode digitar algo nesta janelinha que todos verão as mensagens.

 

O sistema está constantemente fazendo refresh por trás com Ajax, para que quando algum usuário digitar uma nova mensagem, os outros usuários possam ver esta nova mensagem sem clicarem em nada, ou seja, sim é óbvio, isso é a base de um chat... :)

 

Mais coisas... como o sistema é restrito a membros registrados no site, automaticamente quando entram na janelinha de chat aparece o nome de usuário, que ao clicar vai direto para o perfil do mesmo...

 

Até aí tudo bem, mas o que eu pretendo fazer agora é um pouco diferente do que já fiz. Para cada usuário terá de haver uma janelinha de chat única, ou seja, cada usuário terá de ter a sua, para fazer com que as conversas sejam privadas entre os usuários. Neste caso, estou pensando em criar um documento de texto para cada usuário no site e então trabalhar com esta idéia... que como eu disse anteriomente, estou usando um documento de texto para guardar as conversas e não um banco de dados mysql... Será este caminho o mais correto? É que imaginem só se existirem milhares de usuários... e depois também estou pensando que em cada novo registro terei de criar um documento de texto para que este novo usuário tenha lá sua caixinha de chat reservada... Idéias?? Sugestões?? Críticas??

 

Qualquer idéia é bem vinda... Já publiquei uma imagem acima para terem uma idéia de como está ficando o sistema e para não pensarem que o projeto não vai pra frente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara... mas se você não vai criar bando de dados, como você está carregando as atualizações do chat????

 

Porque tipo, se fosse feito com BD, eu faria assim:

 

Iria cadastrando cada mensagem...

 

no ajax, pra buscar novas mensagem e atualizar... eu mandava uma requisição do ajax com a ultima ID de mensagem q mostro... e verificaria se existe algo novo... se existir eu iria criar novos elementos no chat mostrando novas mensagens... ta complicado né??? deixa eu tentar mostrar na pratica:

 

<script>
var ultimoid = 0;
function getMessages()
{
  new Ajax.Request( 'messages.php?id='+ultimoid, {
    onSuccess: function( transport ) {
      var messages = transport.responseXML.getElementsByTagName( 'message' );
      for( var i = 0; i < messages.length; i++ )
      {
        var message = messages[i].firstChild.nodeValue;
        var user = messages[i].getAttribute('user');
        var id = parseInt( messages[i].getAttribute('id') );

        if ( id > ultimoid )
        {
          var elTR = $('chat').insertRow( -1 );
          var elTD1 = elTR.insertCell( -1 );
          elTD1.appendChild( document.createTextNode( user ) );
          var elTD2 = elTR.insertCell( -1 );
          elTD2.appendChild( document.createTextNode( message ) );

          ultimoid = id;
        }
      }
      window.setTimeout( getMessages, 1000 );
    }
  } );
}
getMessages();
</script>

Entendeu que ele não está dando um "refresh" no chat inteiro??? ele está apenas adicionando novas mensagens ao chat... esse código aí é o código que verificaria novas mensagens...

 

Se você ficar dando refresh no chat a cada 1 segundo... vai pesa mto no browser (lado cliente)...

 

Agora, de fazer com txt ou bd... eu preferiria fazer em BD cara, pq não??? BD é uma coisa pra ser usada... vai ficar td guardadinho la, redondinho... e um txt vai fica td espalhado lah nas pastas...

 

Com bd você vai poder criar os usuários lah.... e relacionar as mensagens com ele... sem precisar criar um arquivo soh pra ele... eh sho relacionar... tipo:

 

 

ID ------- MENSAGEM ------ USER_ID ------ DATA

1 -------- "Oi, td bem?" --- 432 ------------ 2009-10-05 02:23:18

2 -------- "Td, e você?" ------- 12 ------------- 2009-10-05 02:23:47

 

Entendeu?

 

Mas também, vai da sua lógica... não tem problema tbm em fazer txt... mas eu acho menos pratico...

 

Abraços,

Lucas Martins.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela resposta Lucas Martins. Desculpa por não ter respondido antes... é que ultimamente não tive muito tempo para trabalhar no projeto devido a trabalhos da faculdade. Mas agora estou com um tempinho livre e vou voltar a trabalhar no projeto do chat. Vou estudar sua idéia e depois deixo aqui uma mensagem. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estive a estudar sobre o Ajax em relação ao sistema de chat, e agora tenho uma dúvida. Vamos supor que temos 2 usuários a conversarem no chat, o Pedro e o Daniel, cada um no seu computador. Bom, o Daniel envia uma mensagem no seu computador e no computador do Pedro, sem clicar em nada, tem de aparecer a mensagem. É aí que entra o Ajax. Mas a minha dúvida é a seguinte...

 

Pelo que eu percebi, de qualquer forma eu terei de mandar constamente "sinais" para o servidor para ele verificar se há novas mensagens, para então saber se há ou não novas mensagens. Este tal sinal seria enviado, por exemplo, de 2 em 2 segundos, e se houver novas mensagens retornará true e faz um refresh no chat com a nova mensagem, senão retorna false e não atualiza o chat.

 

Concluindo... não há como o Ajax só fazer a atualização quando ouver uma mensagem nova, sem ficar verificando de x em x segundos se mudou alguma coisa no servidor? Atenção que não estou falando em ficar atulizando de x em x segundos, mas sim verificando. Não tem como? É mesmo assim que funciona?

 

E já agora Lucas, me explica esta parte do código:

 

window.setTimeout( getMessages, 1000 );

 

Isso seria a tal verificação de novas mensagens de 1000 em 1000 milisegundos? Ou de 1 em 1 segundo certo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

ultimate,

 

é possível fazer conforme mencionou, utilizando ajax, mas não há como fazer algo sem um intermediário. Será sempre necessário o comunicador (server) que transmitirá a mensagem para o outro ponto.

 

num sistema de chat "convencional", o messenger por exemplo, não necessita de um intermediário, pois a comunicação é feita ponto-a-ponto (P2P, per-to-per).

No caso do messenger, o intermediário é utilizado para autenticação somente.

 

para ambiente web, no protocolo http, não há como escapar disso, a não ser que seja instalado algum plugin específico em ambos os lados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ultimate,

 

é possível fazer conforme mencionou, utilizando ajax, mas não há como fazer algo sem um intermediário. Será sempre necessário o comunicador (server) que transmitirá a mensagem para o outro ponto.

 

num sistema de chat "convencional", o messenger por exemplo, não necessita de um intermediário, pois a comunicação é feita ponto-a-ponto (P2P, per-to-per).

No caso do messenger, o intermediário é utilizado para autenticação somente.

 

para ambiente web, no protocolo http, não há como escapar disso, a não ser que seja instalado algum plugin específico em ambos os lados.

 

Muito obrigado hinom! http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

 

Agora já posso continuar com o projeto... a parte do planeamento já está feita. Agora vou aos fóruns de programação para esclarecer algumas dúvidas. Obrigado a todos! ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Concluindo... não há como o Ajax só fazer a atualização quando ouver uma mensagem nova, sem ficar verificando de x em x segundos se mudou alguma coisa no servidor? Atenção que não estou falando em ficar atulizando de x em x segundos, mas sim verificando. Não tem como? É mesmo assim que funciona?

 

E já agora Lucas, me explica esta parte do código:

 

window.setTimeout( getMessages, 1000 );

 

Isso seria a tal verificação de novas mensagens de 1000 em 1000 milisegundos? Ou de 1 em 1 segundo certo?

 

Sobre a sua primeira pergunta, isso não é possível apenas com AJAX e PHP... mas há uma possibilidade utilizando conexão baseada em socks com flash, aí já são outros quinhentos.

 

Isso mesmo, essa é a parte que verifica se há novas mensagens de 1 em 1 seg, lembrando que ele apenas adiciona novas mensagens ao invés de dar refresh no chat inteiro... isso melhora a performance porque o servidor não precisará me trazer todos os dados novamente, apenas os dados dos novos registros...

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hm.. isso quer dizer que se eu utilizar um banco de dados mysql por exemplo, terei de ficar fazendo SELECTs ao Mysql de x em x segundos para ver se alguma coisa mudou por lá? É assim que funciona? Bom.. por um lado eu não estaria fazendo refresh na página (lado do cliente) toda hora, mas por outro o servidor não dava "break"? Imagina só umas 1000 pessoas no site fazendo consultas mysql ao servidor de 1 em 1 segundo... Mas é assim mesmo que funciona? Ou eu entendi mal? :huh:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hm.. isso quer dizer que se eu utilizar um banco de dados mysql por exemplo, terei de ficar fazendo SELECTs ao Mysql de x em x segundos para ver se alguma coisa mudou por lá? É assim que funciona? Bom.. por um lado eu não estaria fazendo refresh na página (lado do cliente) toda hora, mas por outro o servidor não dava "break"? Imagina só umas 1000 pessoas no site fazendo consultas mysql ao servidor de 1 em 1 segundo... Mas é assim mesmo que funciona? Ou eu entendi mal? :huh:

 

É assim, pelo menos um chat utilizando AJAX com PHP e MySQL, é assim mesmo. Como já te falei, você tem a alternativa de usar socket, mas daí já é outro esquema, não tem nada a ver com AJAX.

 

E assim, se você tem 100, 200 ou até uns 300 usuários no chat ao mesmo tempo, talvez você só precise de um bom servidor de hospedagem, pois o MySQL aguenta sim.

 

Agora, se você quer competir com um chat do UOL por exemplo, aí já é outro esquema também, ou você acha q eles usam um banco de dados open-source como o MySQL ???

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Hm.. isso quer dizer que se eu utilizar um banco de dados mysql por exemplo, terei de ficar fazendo SELECTs ao Mysql de x em x segundos para ver se alguma coisa mudou por lá? É assim que funciona? Bom.. por um lado eu não estaria fazendo refresh na página (lado do cliente) toda hora, mas por outro o servidor não dava "break"? Imagina só umas 1000 pessoas no site fazendo consultas mysql ao servidor de 1 em 1 segundo... Mas é assim mesmo que funciona? Ou eu entendi mal? :huh:

 

É assim, pelo menos um chat utilizando AJAX com PHP e MySQL, é assim mesmo. Como já te falei, você tem a alternativa de usar socket, mas daí já é outro esquema, não tem nada a ver com AJAX.

 

E assim, se você tem 100, 200 ou até uns 300 usuários no chat ao mesmo tempo, talvez você só precise de um bom servidor de hospedagem, pois o MySQL aguenta sim.

 

Agora, se você quer competir com um chat do UOL por exemplo, aí já é outro esquema também, ou você acha q eles usam um banco de dados open-source como o MySQL ???

 

Abraços

 

Obrigado Lucas! Já estava com esta dúvida há muito tempo. Agora fiquei bem esclarecido. Agora vou estudar mais sobre o Ajax para poder terminar meu sistema de chat. Vlw! http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

O amigo ai so esqueceu de dizer tambem que para um chat com sockets vai precisar de um dedicado ja que um host de site nao roda arquivos exe que sera o servidor do chat agora se o cara ai quer um chat bem descontraido e so pegar um de graça com a chat.com que e em flash e tem muitas funcionabilidades e voce nao paga nada e em sockets e fica hospedado nos eua eles te dao um load que voce coloca na sua pagina automaticamente voce vira dono e pode banir dar moderador da membro da quik e usar avatar colocar foto ou seja pintar o 7.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, sou o ULTIMATE só que já mudei de conta... Obrigado pela dica. Mas se for para fazer o chat terá que ser por conta própria mesmo, um chat totalmente feito por mim. Não gosto de utilizar sistemas prontos, mesmo que possa ser todo editado ao nosso gosto... porque não há nada melhor que o um sistema criado por nós mesmos não é... :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.