zoukankan      html  css  js  c++  java
  • 我心中的核心组件(可插拔的AOP)~第六回 消息组件~续

    回到目录

    上一回写消息组件已经是很久之前的事了,这一次准备把消息组件后续的东西说一下,事实上,第一篇文章主要讲的是发消息,而这一讲最要讲的是收消息,简单的说,就是消息到了服务器之后,如何从服务器实时的发到指定客户端,当然,你可以使用JS的轮询,但由于种种原因,它并不被我推荐,呵呵.

    准备知识:

    SignalR实现服务器与客户端的实时通信

    WebSocket的介绍

    NodeJS系列~第一个小例子,实现了request.querystring功能

    干实事

    当客户端与服务器建立一个connection后,通过websocket技术,可以告诉服务器你的连接ID,这时,当然服务器检查到有你的消息时,直接为你的connectionID去发请求,调你的客户端方法,实现消息的显示就可以了,呵呵.这一切来的是那么容易,事实上,它内容的技术远不指这些,如果我们自己开发websocket,那除非你是个协议高手+JS高手,否则没戏!所有,我们就只好用人家写好的东西了,而微软的SignalR就是这样一个东西,当你的浏览器支持html5时,它会与websocket方式进行与服务器端的通讯,不支持HTML5,它与会使用其它手段来实现这个通讯的目的.

    下面我复制之前写过的signalR文章中的部分代码:

    第一 首先是服务器需要发布一个URI,来让客户端去访问

      [HubName("MessagePush ")]
        public class MessagePush : Hub
        {
        //实现消息推送的逻辑
      }

    第二 一个集合,用来存储正处于登陆的用户,对于持久化的方式你可以使用内存,nosql等技术,这里没有所谓,呵呵,它是一个服务器端的方法,可以被客户端JS去调用

     static List<CurrentUser> ConnectedUsers = new List<CurrentUser>();
            public void Connect(string url)
            {
                var id = Context.ConnectionId;
                var userID = (HttpContext.Current.Session == null ? "" : HttpContext.Current.Session["UserID"] ?? "").ToString();
                if (ConnectedUsers.Count(x => x.ConnectionId == id) == 0)
                {
                    ConnectedUsers.Add(new CurrentUser
                    {
                        ConnectionId = id,
                        UserID = userID,
                    });
                    Clients.Caller.onConnected(id, userID, url);
                   Clients.Client(id).onNewUserConnected(id, userID);
                }          
            }

    第三 服务器调用客户端的方法

      Clients.AllExcept(id).onNewUserConnected(id, userID); //向所有客户端推送,除了自己之外
      Clients.Client(id).onNewUserConnected(id, userID);//向自己去推送
      Clients.All.onNewUserConnected(id, userID);//向所有客户端推送

    第四 客户端代码,JS方法

       <!--Reference the SignalR library. -->
        <script src="/Scripts/jquery.signalR-1.0.0.js"></script>
        <!--Reference the autogenerated SignalR hub script. -->
        <script src="/signalr/hubs"></script>
    
        <script type="text/javascript">
            $(function () {
                // Declare a proxy to reference the hub
                var chatHub = $.connection.MessagePush;
                registerClientMethods(chatHub);
                // Start Hub
                $.connection.hub.start().done(function () {
                    registerEvents(chatHub);
                });
    
            });
    
            //注册客户端事件
            function registerEvents(chatHub) {
                $("#btn").click(function () {
                   chatHub.server.connect(url);
                });
      
            }
    
            //注册客户端方法
            function registerClientMethods(chatHub) {
    
                  
                chatHub.client.onNewUserConnected = function (id, userID) {
                    alert("新用户完成为合法");
                }
    
            
            }
    
        </script>

    第五 测试http://localhost:8080/MessagePush

    第六 总结:事实上,实现的过程很简单,首先客户端通过登陆告诉服务器我来了,然后用户向服务端发消息,告诉服务器我要给某某某发消息了,其次,服务器收到消息之后,进行分发消息,由于用户登陆后已经在服务器上登记了,所以,很容易的找到了"消息的接受者",最后,服务端调用指定客户端的JS方法,去显示和提醒用户:您老人家有新消息了,呵呵!

    回到目录

     

  • 相关阅读:
    cf B. Sereja and Suffixes
    cf E. Dima and Magic Guitar
    cf D. Dima and Trap Graph
    cf C. Dima and Salad
    最短路径问题(floyd)
    Drainage Ditches(网络流(EK算法))
    图结构练习—BFSDFS—判断可达性(BFS)
    Sorting It All Out(拓扑排序)
    Power Network(最大流(EK算法))
    Labeling Balls(拓扑)
  • 原文地址:https://www.cnblogs.com/lori/p/3459755.html
Copyright © 2011-2022 走看看