[Resolvido] [Puzzle] Chat Privado (WebSockets + PHP Sockets)
Fala galera, estou aqui para pedir a ajuda de todos voces. Tudo que iremos tentar fazer é criar um chat privado utilizando websockets junto ao php sockets, para adiantar algumas coisas eu ja fiz um chat e disponibilizei no github, voces podem acessar atraves do link abaixo:
>
https://github.com/micilini/PHPSockets-With-WebSockets
Esse chat funciona perfeitamente, mas no entanto ele é um chat global, ou seja, uma mensagem enviada por um usuario X, vai para todos os usuarios que estão na sala do chat. Como dito anteriormente a nossa ideia é criar um chat privado, então vamos a algumas considerações:
- No meu caso estou utilizando os arquivos dentro da pasta easychat (que esta no link enviado anteriormente)
- Podemos utilizar node.js, socket.io e afins? Não, estou querendo resolver somente com php e javascript puro.
Agora chegou a hora de dar uma pincelada no meu codigo:
Aplicacao.js
Existem duas funções responsaveis por enviar e receber a mensagem do servidor e abaixo estão elas:
form.onsubmit = function(e) { e.preventDefault(); // Recuperando a mensagem do textarea.
var mensagem = mensagemTexto.value; // Enviando a mensagem através do WebSocket.
socket.send(mensagem); // Adicionando a mensagem numa lista de mensagens enviadas.
listaMensagem.innerHTML += '<li class="envia"><span>Enviado:</span>' + mensagem + '</li>'; // Limpando o campo da mensagem após o envio.
mensagemTexto.value = ''; return false;
};
socket.onmessage = function(event) {
var mensagem = event.data; listaMensagem.innerHTML += '<li class="recebida"><span>Recebida:</span>' + mensagem + '</li>';
};
Quando enviamos uma mensagem ele executa o comando socket.send(mensagem) ali eu pensei em enviar mais alguns parametros como:
- IP do usuario (Pode precisar)
- Chat de onde ele esta acessando (Chat1, Chat2, Chat3)
- Mensagem (é claro rs)
Já no lado do PHP, o comando abaixo é responsavel por pegar a resposta do usuario e retorna-la de volta:
Server.php
}else{
$bytes = socket_recv($sock, $data, 2048, null);
$d = unmask($data);
foreach ($cls as $socket) {
if($socket != $m_sock && $val > 0){try{
socket_write($socket,(encode($d)));
}catch(Exception $e){
unset($cls[$socket]);
socket_close($cls[$socket]);
}
}
}
}
}
Com o comando socket_recv ele consegue captar a mensagem que esta sendo enviada e realiza a função unmask nela, um pouco mais adiante ele faz o encode desta mensagem que recebeu e envia de volta para aquele socket (e todos que estão conectados naquele socket recebem a mensagem).
Nesse caso, como nosso chat é privada devemos pensar tambem em fazer o insert e em seguida um select no banco de dados, entao melhor maneira de fazer isso é inserindo esses comandos entre os codigos **try** e **socket_write**, então vamos aos testes:
......
try{
//Aqui estabilizamos uma conexão com o banco de dados e inserimos na tabela a mensagem + ip + data + Chat1 (ou 2 ou 3).
socket_write($socket,(encode($d)));
}
.....
Acho que tambem seria melhor criar um campo no banco de dados para verificar se a mensagem foi visualizada ou não?
Depois que inserimos no banco de dados chegou a hora do puzzle:
Como iremos fazer para retornar a mensagem para aquele determinado usuario?
Antes de respondermos a esta pergunta vamos criar um cenario novo e de simples visualização para todos nos:
- Vamos criar um arquivo php com 2 links: Ir para o Chat 1 & Ir para o Chat 2
- Vamos reaproveitar aqueles arquivos dentro da pasta EasyChat
- Vamos duplicar o arquivo index.php, criando indexChat1.php e IndexChat2.php
Ambos os indexs irão utilizar a porta 8080 (assim como esta no github), Não! nos não iremos separar os chats em portas diferentes (tenha em mente que isso é so um teste para realizar algo mais completo lá na frente, IMAGINE 10000 chats privados acontecendo simultaneamente e abrimos uma porta para cada um deles......).
Entao apartir deste momento temos 2 indexes diferentes utilizando os mesmos arquivos: aplicacao.js e server.php, no caso do arquivo aplicacao.js ele envia valores diferentes para o socket php como ip, mensagem e o tipo de chat que ele esta inserido, como chat1 ou chat 2.
Executandos os Testes
OK, vamos abrir o arquivo indexChat1.php em uma aba, e indexChat2.php em outra aba do nosso navegador, vamos inicialmente escrever uma mensagem no chat1, quando fizermos isso (e do jeito que nosso codigo atualmente esta), a mensagem será recebida tambem na aba do chat2, e a mesma coisa aconteceria caso digitarmos algo no chat2.
Mas pelo menos no banco de dados esta dá seguinte forma:
ID = 0
IP = 32.22.221.22
Local = Chat1
Mensagem = Olá mundo
Data = 01/01/2016
Visualizado = false
Agora voltamos a seguinte pergunta: Como iremos fazer para os usuarios que estão no chat1, nao receber e nem enviar mensagens para os usuarios que estão no chat2 e virce-versa?
Eu acredito que a resposta esta na criação de um codigo que ainda nao sabemos mas que deve ser colocado dentro do arquivo server.php mais especificamente entre os comandos try e socket_write.
Alguem tem mais alguma ideia para contribuir, assim que vou avançando postarei algumas soluções neste post ;)
Discussão (3)
Carregando comentários...