Trocando mensagens e notificações entre Server/Client de forma global e individual
Neste artigo, vou demonstrar como podemos requisitar uma função em server-side, e após o término, notificar todos os usuários conectados (client-side), ou apenas algum(ns) usuário(s) específico(s).
Para todos os exemplos, estou considerando que a importação dos scripts e referências para o SignalR já tenham sido realizadas.
Notificação Global
Veja como é simples o envio de notificações em tempo real para todos os usuários conectados, primeiramente vamos criar nossa conexão no script do cliente (client-side):
01.<script language="javascript" type="text/javascript">02. 03. $(function () {04. 05. // Cria objeto de conexão06. var nomeHubClient = $.connection.nomeHub;07. 08. // Função que envia mensagem para o servidor09. $("#btnEnviaMsg").click(function () {10. 11. var mensagem = $('#mensagem').val();12. nomeHubClient.enviaMensagem(mensagem);13. $('#mensagem').val("");14. 15. });16. 17. // Inicia a conexão18. $.connection.hub.start(function () {19. // Envia para o servidor o usuário que está criando a conexão20. // O campo #nomeUsuario é apenas um campo presente na nossa página aspx que identifica o nome do usuário em questão (Não é obrigatório)21. nomeHubClient.join($('#nomeUsuario').val(""));22. });23. 24. // Função chamada em real-time pelo servidor25. nomeHubClient.novaMensagem = function (mensagem) {26. mensagem = $("#mensagens").html() + "<br />" + mensagem;27. $("#mensagens").html(mensagem);28. };29. });30. 31.</script>
Em seguida vamos criar nossa classe de conexão (Hub) no servidor:
01.[HubName("nomeHub")]02.public class NomeHub : Hub03.{04. 05. public void Join(string nomeUsuario)06. {07. EnviaMensagem(string.format("usuário {0} logado.", nomeUsuario));08. }09. 10. public void EnviaMensagem(string mensagem)11. {12. Clients.novaMensagem(mensagem);13. }14.}
Podemos ver que ao inciar a conexão, o método Join será chamado automaticamente, posteriormente, a propriedade Clients dispara para todas os clientes conectados (todas conexões abertas) a mensagem recebida.
Notificação Individual
Vamos ver agora como podemos fazer para enviar uma notificação apenas para um usuário específico. Para tanto temos a propriedade $.connection.hub.id, esta propriedade gera automaticamente uma especie de guid para nossa conexão, podendo assim via server-side, saber para qual conexão enviar a notificação.
Desta forma, ficamos com o seguinte bloco de código:
01.<script language="javascript" type="text/javascript">02. 03. $(function () {04. 05. // Cria objeto de conexão06. var nomeHubClient = $.connection.nomeHub;07. 08. // Função que envia mensagem para o servidor09. $("#btnEnviaMsg").click(function () {10. 11. var mensagem = $('#mensagem').val();12. nomeHubClient.enviaMensagem(mensagem);13. $('#mensagem').val("");14. 15. });16. 17. // Inicia a conexão18. $.connection.hub.start(function () {19. // Obtém o ID da conexão criada20. var conexaoId = $.connection.hub.id; 21. 22. // Envia para o servidor o nome do usuário que está criando a conexão e o ID da conexão criada23. // O campo #nomeUsuario é apenas um campo presente na nossa página aspx que identifica o nome do usuário em questão (Não é obrigatório)24. nomeHubClient.join($('#nomeUsuario').val(""), conexaoId);25. });26. 27. // Função chamada em real-time pelo servidor28. nomeHubClient.novaMensagem = function (mensagem) {29. mensagem = $("#mensagens").html() + "<br />" + mensagem;30. $("#mensagens").html(mensagem);31. };32. });33. 34.</script>
Agora basta modificarmos nossa classe Hub no servidor, para que faça uso do ID da conexão enviada como parâmetro:
01.[HubName("nomeHub")]02.public class NomeHub : Hub03.{04. public void Join(string nomeUsuario, string conexaoId)05. {06. EnviaMensagem(string.format("usuário {0} logado.", nomeUsuario), conexaoId);07. }08. 09. public void EnviaMensagem(string mensagem, string conexaoId)10. {11. Clients[conexaoId].novaMensagem(mensagem);12. }13.}
Bem fácil e simples não? ao especificar o id da conexão na propriedade Clients, apenas a conexão informada receberá a notificação com a mensagem. Neste exemplo, enviamos a notificação para o próprio usuário que realizou a ação, porém, da mesma forma que obtemos o ID da conexão do próprio usuário, podemos utilizar um ID de outra conexão (para tanto, teríamos que implementar alguma estrutura para listar as conexões abertas, para que assim, seja possível o usuário selecionar a quem deseja notificar).
Uma outra forma de notificarmos apenas o usuário que realizou a ação, é utilizando a propriedade Caller, veja:
01.public void Join(string nomeUsuario, string conexaoId)02.{03. EnviaMensagem(string.format("usuário {0} logado.", nomeUsuario), conexaoId);04.}05. 06.public void EnviaMensagem(string mensagem, string conexaoId)07.{08. // Notifica apenas o usuário que possui o ID da conexão09. Clients[conexaoId].novaMensagem(mensagem); 10. 11. // Notifica apenas o usuário que realizou a chamada ao método Join12. Caller.novaMensagem(mensagem);13.}
Rafael Zaccanini
MTAC – Microsoft Technical Audience Contributor
Blog: http://www.rafaelzaccanini.net
**Twitter: **@rafaelzaccanini
Facebook: http://www.facebook.com/RafaelZaccaniniNet