服务器推送消息到客户端 SignalR 弹出消息


1.先来看一下成果:

打开多个客户端,输入不同的用户名:

用xuanwuziyou用户给pet用户发送消息,点击发送之后,pet用户即收到新消息弹出提示:

2.技术:Asp.NET的SignalR,详情见官网 http://www.asp.Net/signalr
http://www.asp.net/signalr/overview/signalr-20/getting-started-with-signalr-20/tutorial-getting-started-with-signalr-20
使用环境:VS2013 WebForm项目。
3.新建一个WebApplication的空项目,项目结构:

4.步骤1:添加ChatHub.cs类,如下:

ChatHub.cs代码:

[csharp]view plaincopy
  1. usingSystem;
  2. usingSystem.Collections.Generic;
  3. usingSystem.Linq;
  4. usingSystem.Web;
  5. usingMicrosoft.AspNet.SignalR;
  6. namespaceSignalRChat
  7. {
  8. publicclassChatHub:Hub
  9. {
  10. publicvoidSendEmail(stringreceiver,stringsender,stringmessage)
  11. {
  12. //调用广播方法推送消息到客户端
  13. Clients.All.broadcastMessage(receiver,sender,message);
  14. }
  15. }
  16. }

步骤2:添加Startup.cs类,如下:

Startup.cs代码:

[csharp]view plaincopy
  1. usingSystem;
  2. usingSystem.Threading.Tasks;
  3. usingMicrosoft.Owin;
  4. usingOwin;
  5. [assembly:OwinStartup(typeof(SignalRChat.Startup))]
  6. namespaceSignalRChat
  7. {
  8. publicclassStartup
  9. {
  10. publicvoidConfiguration(IAppBuilderapp)
  11. {
  12. //Anyconnectionorhubwireupandconfigurationshouldgohere
  13. app.MapSignalR();
  14. }
  15. }
  16. }


添加上这两个类,那么项目所需要的Scripts文件和引用就会自动添加进来。

步骤3:添加一个Html页叫做“邮件通知.html”,内容如下:

[html]view plaincopy
  1. <!DOCTYPEhtml>
  2. <htmlxmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/>
  5. <title>邮件通知</title>
  6. <scriptsrc="Scripts/jquery-1.10.2.min.js"></script>
  7. <scriptsrc="/Scripts/jquery.signalR-2.0.0.js"></script>
  8. <scriptsrc="/signalr/hubs"></script>
  9. <script>
  10. varusername;
  11. $(function(){
  12. $("#notify").hide();
  13. $("#submit").click(function(){
  14. username=$("#username").val();
  15. $("#tishi").html("当前用户:"+username);
  16. $("#shuru").hide();
  17. $("#username").hide();
  18. $("#submit").hide();
  19. });
  20. varchat=$.connection.chatHub;
  21. chat.client.broadcastMessage=function(receiver,sender,message){//显示从服务端收到的信息
  22. if(username==receiver){
  23. $("#sender").text(sender);
  24. $("#receiveMsg").text(message);
  25. $("#notify").slideDown();
  26. }
  27. };
  28. $.connection.hub.start().done(function(){//发送信息到服务端
  29. $('#sendmsg').click(function(){
  30. chat.server.sendEmail($("#receiver").val(),username,$("#msg").val());
  31. });
  32. });
  33. $("#cancle").click(function(){
  34. $("#notify").slideUp();
  35. });
  36. });
  37. </script>
  38. </head>
  39. <body>
  40. <h1>邮件通知</h1>
  41. <labelid="shuru">请输入用户名:</label>
  42. <inputtype="text"id="username"/>
  43. <inputtype="button"id="submit"value="确定"/>
  44. <br/><labelid="tishi"></label>
  45. <hr/>
  46. <div>
  47. 收件人:<inputtype="text"id="receiver"/>
  48. <br/>内容:<inputtype="text"id="msg"/>
  49. <br/><br/><inputtype="button"id="sendmsg"value="发送"/>
  50. </div>
  51. <p></p>
  52. <divid="notify"style="width:300px;height:140px;float:right;margin-bottom:10px;border:solid;background-color:yellow;">
  53. <br/>
  54. <br/>
  55. 新消息来自:<spanid="sender"></span><br/>
  56. 内容:<spanid="receiveMsg"></span>
  57. <br/><br/><br/>
  58. <inputtype="button"id="cancle"value="我知道啦"style="float:right"/>
  59. </div>
  60. </body>
  61. </html>

5.然后就可以生成项目并运行了。

6.讲解:ChatHub.cs中的SendEmail(string receiver, string sender, string message)方法由我们自己编写,

这个方法在前端的JavaScript中被调用了:

[html]view plaincopy
  1. $.connection.hub.start().done(function(){//发送信息到服务端
  2. $('#sendmsg').click(function(){
  3. chat.server.sendEmail($("#receiver").val(),username,$("#msg").val());
  4. });
  5. });

只是把SendEmail调用时写作sendEmail,即第一个字母小写。这个方法在当singalr准备好之后,
在前端调用后台的方法把数据广播出去。

[html]view plaincopy
  1. chat.client.broadcastMessage=function(receiver,sender,message){//显示从服务端收到的信息
  2. if(username==receiver){
  3. $("#sender").text(sender);
  4. $("#receiveMsg").text(message);
  5. $("#notify").slideDown();
  6. }
  7. };

这个方法,正是客户端收到了服务器广播发来的数据之后调用的方法,收到的参数正是我们在
SendEmail中规定传送的参数。本程序中把收到的信息弹出给相应的用户。

就这样,实现了信息的实时推送,也就是服务器端主动向客户端推送消息的方式。结束。

优质内容筛选与推荐>>
1、C语言函数调用栈(三)
2、【js】使用var与不使用var之间的区别
3、fetch_all与fetch_row的区别。 一维数组与二维数组的区别。
4、原生aJax跨域
5、这是用来给qq认证用的


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn