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方法,去显示和提醒用户:您老人家有新消息了,呵呵!

    回到目录

     

  • 相关阅读:
    敏捷之一:以终为始
    Rails non browser app高级篇-capistrano/daemon部署
    ios 5下设置屏幕方向为landscape
    Android敏捷开发实践(连载)
    Rails+Mongodb的一个重要技巧:如何得到last N Records?
    在macos x上 编译jzmq 3.x
    计划缓冲区
    转载程序员的十层楼
    特权账户是什么?
    如何管理公司的共享iPad?
  • 原文地址:https://www.cnblogs.com/lori/p/3459755.html
Copyright © 2011-2022 走看看