回到目录

上一回写消息组件已经是很久之前的事了,这一次准备把消息组件后续的东西说一下,事实上,第一篇文章主要讲的是发消息,而这一讲最要讲的是收消息,简单的说,就是消息到了服务器之后,如何从服务器实时的发到指定客户端,当然,你可以使用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) == )
{
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)~第六回 消息组件~续的更多相关文章

  1. 我心中的核心组件(可插拔的AOP)~第二回 缓存拦截器

    回到目录 AOP面向切面的编程,也称面向方面的编程,我更青睐于前面的叫法,将一个大系统切成多个独立的部分,而这个独立的部分又可以方便的插拔在其它领域的系统之中,这种编程的方式我们叫它面向切面,而这些独 ...

  2. 我心中的核心组件(可插拔的AOP)~大话开篇及目录

    回到占占推荐博客索引 核心组件 我心中的核心组件,核心组件就是我认为在项目中比较常用的功能,如日志,异常处理,消息,邮件,队列服务,调度,缓存,持久化,分布式文件存储,NoSQL存储,IoC容器,方法 ...

  3. 我心中的核心组件(可插拔的AOP)~第四回 异常拦截器

    回到目录 之前说过有关拦截器的文章,第二回  缓存拦截器,事实上,在那讲里说的最多是AOP和缓存组件,对于拦截的概念并没有详细的说明,这一讲,不说AOP,主要说一下拦截器,拦截器Interceptio ...

  4. 我心中的核心组件(可插拔的AOP)~第五回 消息组件

    回到目录 之所以把发消息拿出来,完全是因为微软的orchard项目,在这个项目里,将公用的与领域无关的功能模块进行抽象,形成了一个个的组件,这些组件通过引用和注入的方式进行工作,感觉对于应用程序的扩展 ...

  5. 我心中的核心组件(可插拔的AOP)~调度组件quartz.net

    回到目录 quartz.net是一个任务调度组件,它可以灵活的设置你的调试方式,按时间,按日期,按周期都可以很容易的实现,quartz不仅可以用在web中,而且还可以部署在winform,winser ...

  6. 我心中的核心组件(可插拔的AOP)~第十二回 IoC组件Unity

    回到目录 说在前 Ioc组件有很多,之前也介绍过autofac,castle等,今天再来说一下在微软Nlayer DDD架构里使用的unity组件,今天主要说一下依靠注入,如果希望看拦截的用法,可以阅 ...

  7. 我心中的核心组件(可插拔的AOP)~第十三回 实现AOP的拦截组件Unity.Interception

    回到目录 说在前 本节主要说一下Unity家族里的拦截组件,对于方法拦截有很多组件提供,基本上每个Ioc组件都有对它的实现,如autofac,它主要用在orchard项目里,而castle也有以拦截的 ...

  8. 我心中的核心组件(可插拔的AOP)~第十五回 我的日志组件Logger.Core(策略,模版方法,工厂,单例等模式的使用)

    回到目录 之前的讲过两篇关于日志组件的文章,分别是<第一回  日志记录组件之自主的Vlog>和<第三回  日志记录组件之log4net>,而今天主要说一下我自己开发的另一种日志 ...

  9. 我心中的核心组件(可插拔的AOP)~调度组件quartz.net续~任务管理器的开发

    回到目录 对于任务调度来说,越来越多的团队选择了quartz,它在java和.net环境下表现都十分优秀,配置简单,功能强大,时间表达式配置灵活,但在使用时,还是感觉缺点什么,怎么说,你在服务器上安装 ...

随机推荐

  1. Cracking-- 4.7 在一颗二叉树中找两个节点的第一个共同祖先

    分别记录从 root 到 node1 的path 到 node2的path,再找其中共同的部分 struct Node{ int val; struct Node *left; struct Node ...

  2. javascript实现字符串的截取

    截取字符串方法有很多的,(不含根据传入参数截取成数组的split()方法)这里说的是子字符串,所以不说split()方法了. slice(),substr(),substring()一共三种方法,其中 ...

  3. sharepoint 网站创建

    打开开始菜单,右键sharepoint管理中心以管理员身份打开 打开管理web应用程序菜单,并新建web应用程序 新建web应用程序配置,大多数采用默认配置. 建议自定义端口号,URL的端口号和设置的 ...

  4. Alpha、Beta、RC、GA版本的区别 ZT

    http://www.blogjava.net/RomulusW/archive/2008/05/04/197985.html Alpha:是内部测试版,一般不向外部发布,会有很多Bug.一般只有测试 ...

  5. javascript 中的事件机制

    1.javascript中的事件. 事件流 javascript中的事件是以一种流的形式存在的. 一个事件会也有多个元素同时响应. 有时候这不是我们想要的效果, 我们只是需要某个特定的元素相应我们的绑 ...

  6. 网络流EK

    #include <iostream> #include <queue> #include <string.h> #define MAX 302 using nam ...

  7. android ProgressBar 进度条的进度两端是圆角的方法

    转自 http://www.jianshu.com/p/6e7ea842d5ce 另外工作原理可以参考http://blog.csdn.net/lan603168/article/details/44 ...

  8. C#线程同步的几种方法

    一.volatile关键字 volatile是最简单的一种同步方法,当然简单是要付出代价的.它只能在变量一级做同步,volatile的含义就是告诉处理器, 不要将我放入工作内存, 请直接在主存操作我. ...

  9. JS继承模式粗探

    之前提到了JS中比较简单的设计模式,在各种设计模式中被最常使用的工具之一就是原型链的继承.作为OOP的特质之一——继承,今天主要谈谈JS中比较简单的继承方法. 最基础的原型链继承在这里就不复述了,主要 ...

  10. 常用正则表达式-copy

    匹配中文:[\u4e00-\u9fa5] 英文字母:[a-zA-Z] 数字:[0-9] 匹配中文,英文字母和数字及_: ^[\u4e00-\u9fa5_a-zA-Z0-9]+$ 同时判断输入长度:[\ ...