我心中的核心组件(可插拔的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方法,去显示和提醒用户:您老人家有新消息了,呵呵!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:我心中的核心组件(可插拔的AOP)~第六回 消息组件~续,如需转载请自行联系原博主。

目录
相关文章
|
4月前
|
Java Spring
Spring的AOP组件详解
该文章主要介绍了Spring AOP(面向切面编程)组件的实现原理,包括Spring AOP的基础概念、动态代理模式、AOP组件的实现以及Spring选择JDK动态代理或CGLIB动态代理的依据。
Spring的AOP组件详解
|
JSON API 数据格式
.net core工具组件系列之Autofac—— 第一篇:Autofac系列Autofac的几种常见注册方式、生命周期和AOP
使用Autofac进行服务注册实践:新建三个项目,分别是webapi项目 Wesky.Core.Autofac以及两个类库项目 Wesky.Core.Interface和Wesky.Core.Service。在Webapi项目下,引用Autofac的三个包:Autofac、Autofac.Configuration和Autofac.Extensions.DependencyInjection 。
1354 1
.net core工具组件系列之Autofac—— 第一篇:Autofac系列Autofac的几种常见注册方式、生命周期和AOP
|
缓存 Java Spring
【小家Spring】Spring AOP各个组件概述与总结【Pointcut、Advice、Advisor、Advised、TargetSource、AdvisorChainFactory...】(上)
【小家Spring】Spring AOP各个组件概述与总结【Pointcut、Advice、Advisor、Advised、TargetSource、AdvisorChainFactory...】(上)
【小家Spring】Spring AOP各个组件概述与总结【Pointcut、Advice、Advisor、Advised、TargetSource、AdvisorChainFactory...】(上)
|
Java Spring 容器
【小家Spring】Spring AOP各个组件概述与总结【Pointcut、Advice、Advisor、Advised、TargetSource、AdvisorChainFactory...】(下)
【小家Spring】Spring AOP各个组件概述与总结【Pointcut、Advice、Advisor、Advised、TargetSource、AdvisorChainFactory...】(下)
|
安全 Java Spring
【小家Spring】Spring AOP各个组件概述与总结【Pointcut、Advice、Advisor、Advised、TargetSource、AdvisorChainFactory...】(中)
【小家Spring】Spring AOP各个组件概述与总结【Pointcut、Advice、Advisor、Advised、TargetSource、AdvisorChainFactory...】(中)
|
中间件 Java Spring
在.NET Core中三种实现“可插拔”AOP编程方式(附源码)
一看标题肯定会联想到使用动态编织的方式实现AOP编程,不过这不是作者本文讨论的重点。 本文讨论另外三种在netcore中可实现的方式,Filter(过滤器,严格意义上它算是AOP方式),DynamicProxy(动态代理方式,JAVA上早已不是新鲜事),Middleware(netcore中间件所实现的AOP方式)   什么是AOP编程 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
5835 0
|
微服务
【微服务No.3】AOP组件ASPectCore简单使用
介绍: AspectCore是.NET标准的基于AOP的跨平台框架【github解释】。主要支持:对方面拦截器,依赖注入集成,Web应用程序,数据验证等的核心支持。 使用实例: 首先安装dll: Install-Package AspectCore.
2032 0
|
SQL XML 前端开发
bboss aop/ioc组件配置语法诠释
     这篇文章全面介绍bboss ioc 配置语法,希望对正在使用bboss或者即将使用bboss或者想了解bboss的朋友有所帮助;希望有助于大家了解和认识bboss,如果有不妥请大家批评指正。
1147 0
|
3月前
Micronaut AOP与代理机制:实现应用功能增强,无需侵入式编程的秘诀
AOP(面向切面编程)能够帮助我们在不修改现有代码的前提下,为应用程序添加新的功能或行为。Micronaut框架中的AOP模块通过动态代理机制实现了这一目标。AOP将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,提高模块化程度。在Micronaut中,带有特定注解的类会在启动时生成代理对象,在运行时拦截方法调用并执行额外逻辑。例如,可以通过创建切面类并在目标类上添加注解来记录方法调用信息,从而在不侵入原有代码的情况下增强应用功能,提高代码的可维护性和可扩展性。
65 1
|
1月前
|
安全 Java 编译器
什么是AOP面向切面编程?怎么简单理解?
本文介绍了面向切面编程(AOP)的基本概念和原理,解释了如何通过分离横切关注点(如日志、事务管理等)来增强代码的模块化和可维护性。AOP的核心概念包括切面、连接点、切入点、通知和织入。文章还提供了一个使用Spring AOP的简单示例,展示了如何定义和应用切面。
90 1
什么是AOP面向切面编程?怎么简单理解?