浅谈C#消息主动推送方法

摘要

在没有消息的时候阻塞这个请求(一直不给返回值)直到快要超时为止,有消息到来再返回响应。客户端收到响应或超时后立即再发起请求。这种算是比较好的方式了,消息能够及时地到达客户端。

四种方案

1、定期查询:间隔特定时间查询数据库,有新消息时显示。优点:实现起来简单;缺点:实时性不够好,对于移动客户端耗电量太大。

2、通过socket推送:建立一个长连接,一有新消息就发送给客户端。在局域网内没问题,但是跨网时客户端一直无法收到消息,据说是要打洞,一直没打通就放弃了。

3、通过短息推送:这个一般有人卖短信发送接口的,但是比较费钱,所以没有考虑

4、长轮询:基本上与目前很多网站使用的方式一样(WEB阿里旺旺、微博、人人等等)。客户端发起一个很长超时时间的请求,然后服务器端在没有消息的时候阻塞这个请求(一直不给返回值)直到快要超时为止,有消息到来再返回响应。客户端收到响应或超时后立即再发起请求。

这种算是比较好的方式了,消息能够及时地到达客户端。但考虑到移动互联网的特点(网络不稳定、设备内存小)这种方式不能保证重要的消息一定能推送到客户端,另外Android在手机内存小的情况下可能会杀这个在等待PUSH消息不怎么活动的进程。

5、C2DM:国外有个pushsharp,是用C#写的,不过c2dm是国外的,由于各种原因经常访问不了(你懂的)。Android Cloud to Device Messaging (C2DM) 作为 Android 2.2 的一部分已经发布了。C2DM 允许第三方开发者开发相关的应用来推送少量数据消息(1024bytes)到用户的手机上。C2DM 创造了一个良好的机会,允许我们使用多种 Google 开发工具来创建一种简单但相当实用的应用类型。用户可以使用该类型的应用把各种各样的信息从他们的台机或者笔电直接 push 到自家的手机上。不过,C2DM已为谷歌更新的Google Cloud Messaging(GCM)协议所取代。

6、MQTT:(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议。

MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:

1、使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;

2、对负载内容屏蔽的消息传输;

3、使用 TCP/IP 提供网络连接;

4、有三种消息发布服务质量:

    • “至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。

    • “至少一次”,确保消息到达,但消息重复可能会发生。

    • “只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。

5、小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;

6、使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制;

这个看起来是为移动客户端准备的,但是因为没找到C#的所以果断放弃了,懂java的可以去看看http://mqtt.org/


7、XMPP:这个是我采用的,以下是他的优缺点

优点

  1. XMPP协议是自由、开放、公开的,并且易于了解。而且在客户端、服务器、组件、源码库等方面,都已经各自有多种实现。

  2. 互联网工程工作小组(IETF)已经将Jabber的核心XML流协议以XMPP之名,正式列为认可的实时通信及Presence技术。而XMPP的技术规格已被定义在RFC 3920及RFC 3921。任何IM供应商在遵循XMPP协议下,都可与Google Talk实现连接。

  3. 第一个Jabber(现在XMPP)技术是Jeremie Miller在1998年开发的,现在已经相当稳定;数以百计的开发者为XMPP技术而努力。今日的互联网上有数以万计的XMPP服务器运作著,并有数以百万计的人们使用XMPP实时传讯软件。

  4. XMPP网络的架构和电子邮件十分相像;XMPP核心协议通信方式是先创建一个stream,XMPP以TCP传递XML数据流,没有中央主服务器。任何人都可以运行自己的XMPP服务器,使个人及组织能够掌控他们的实时传讯体验。

  5. 任何XMPP协议的服务器可以独立于公众XMPP网络(例如在企业内部网络中),而使用SASL及TLS等技术的可靠安全性,已内置于核心XMPP技术规格中。

  6. XML命名空间的威力可使任何人在核心协议的基础上建造定制化的功能;为了维持通透性,常见的扩展有XMPP标准基金会。

  7. XMPP除了可用在实时通信的应用程序,还能用在网络管理、内容供稿、协同工具、文件共享、游戏、远程系统监控等。

  8. 用XMPP协议来建造及布署实时应用程序及服务的公司及开放源代码计划分布在各种领域;用XMPP技术开发软件,资源及支持的来源是多样的,使得使你不会陷于被“绑架”的困境。

  9. 缺点

  10. 随着通常超过70%的XMPP协议的服务器的数据流量的存在和近60%的被重复转发,XMPP协议目前拥有一个大型架空中存在的数据提供给多个收件人。新的议定书正在研究,以减轻这一问题。

  11. XMPP协议的方式被编码为一个单一的长的XML文件,因此无法提供修改二进制数据。因此, 文件传输协议一样使用外部的HTTP。如果不可避免,XMPP协议还提供了带编码的文件传输的所有数据使用的Base64。至于其他二进制数据加密会话(encrypted conversations)或图形图标(graphic icons)以嵌入式使用相同的方法。

接下来说下我的xmpp是怎么搭建的。

首先在服务器安装openfire(当然要先装一个java环境)采用Java开发,开源的实时协作(RTC)服务器基于XMPP(Jabber)协议。具体怎么配置可以参考http://www.cnblogs.com/hoojo/archive/2012/05/17/2506769.html。然后通过一个c#写的agsXMPP(agsXMPP致力于创建一个轻量、快速的跨平台类库,用于XMPP协议。)编写一个客户端,放在服务器上面,这个客户端的作用就是检测系统数据库,当发现有新消息时推送个其他手机客户端。这样一个基于C#语言的消息推送系统就完工了!

转载

IT家园
IT家园

网友最新评论 (0)