Delphi消息推送

移动端的消息推送大家都体验过,智能手机上一大堆广告等各种消息会不时从消息栏中弹出来骚扰你。

PC程序中我们有时也会用到消息推送,比如通知之类。通常我们使用的方法可能更多地使用Socket之类来处理,有时效率更低的方法是做数据库的轮询。如果终端多、消息多,数据库的轮询方式是肯定不能被接受的。

现在比较流行的消息服务器有很多,像Apache的ActiveMQ,升级产品是Apollo,RabbitMQ,还有号称速度最快的ZeroMQ,等等很多。这些消息服务器大多支持各种平台,如Java,PHP,Python等,也大多对Delphi支持。

Delphi下比较著名的客户端是Habari的客户端,官方主页:

https://www.habarisoft.com/

上面有针对ActiveMQ等的专用客户端。

还有这个开源作品:

http://www.danieleteti.it/stomp-client/

代码托管在:

http://code.google.com/p/delphistompclient/

ActiveMQ等对消息的持久化支持比较简单,配置一下就可以,这个百度一下就一大把,关键是通过连接消息服务器,可以使客户端简单地处理消息,做到高效、实时。

下面摘录一点简单的Delphi使用stomp协议客户端的应用吧,就是上面提到的那个开源作品:

Stomp Client

Stomp protocol provides an interoperable wire format so that any of the available Stomp Clients can communicate with any Stomp Message Broker to provide easy and widespread messaging interop among languages, platforms and brokers.

The Delphi Stomp Client is an open source implementation of the STOMP protocol for Delphi 2010 (should work with Delphi 2007 and 2009 too) and FreePascal 2.4.x.

This Delphi Stomp Client isn’t an attempt to copy JMS client architecture to Delphi. So aren’t included some JMS specific features like message transformations.

This stomp client is actually tested on ActiveMQ 5.2 and ActiveMQ 5.3, but should work with every STOMP compliant server.

In Delphi you can use the built-in INDY component suite or the OpenSource Synapse acording with a compiler directive. In StompClient.pas there is following definitions:

unit StompClient;

// For FreePascal users:

// Automatically selected synapse tcp library

{$IFDEF FPC}

{$MODE DELPHI}

{$DEFINE USESYNAPSE} //FREEPASCAL ALWAYS USE SYNAPSE

{$ENDIF}

// For Delphi users:

// Decomment following line to use synapse also in Delphi

{ .$DEFINE USESYNAPSE } //DELPHI USERS CAN USE INDY OR SYNAPSE

Some examples of basic functionalities (not real world example, use included examples instead):

program SimpleMessaging;

{$APPTYPE CONSOLE}

uses

  SysUtils, StompClient, StompTypes;

procedure Example_Pub_Subscriber;

var

  StompPub, StompSubscriber: IStompClient;

  StompFrame: IStompFrame;

begin

  WriteLn(‘==> Example_Pub_Subscriber‘);

  StompSubscriber := StompUtils.NewStomp(‘127.0.0.1‘); // default port

  StompSubscriber.Subscribe(‘/topic/dummy‘);

  StompPub := StompUtils.NewStomp(‘127.0.0.1‘); // default port

  StompPub.Send(‘/topic/dummy‘, ‘Some test message‘);

  repeat

    StompFrame := StompSubscriber.Receive;

  until Assigned(StompFrame);

  WriteLn(StompFrame.GetBody); // Print "Some test message"

  WriteLn;

end;

procedure Example_OnePub_TwoSubscriber;

var

  StompPub, StompSub1, StompSub2: IStompClient;

  StompFrame: IStompFrame;

begin

  WriteLn(‘==> Example_OnePub_TwoSubscriber‘);

  StompSub1 := StompUtils.NewStomp(‘127.0.0.1‘); // default port

  StompSub2 := StompUtils.NewStomp(‘127.0.0.1‘); // default port

  StompSub1.Subscribe(‘/topic/dummy‘);

  StompSub2.Subscribe(‘/topic/dummy‘);

  StompPub := StompUtils.NewStomp(‘127.0.0.1‘); // default port

  StompPub.Send(‘/topic/dummy‘, ‘First test message on a topic‘);

  StompPub.Send(‘/topic/dummy‘, ‘Second test message on a topic‘);

  StompFrame := StompSub1.Receive(2000);

  if Assigned(StompFrame) then

    WriteLn(StompFrame.GetBody);

  StompFrame := StompSub1.Receive(2000);

  if Assigned(StompFrame) then

    WriteLn(StompFrame.GetBody);

  StompFrame := StompSub2.Receive(2000);

  if Assigned(StompFrame) then

    WriteLn(StompFrame.GetBody);

  StompFrame := StompSub2.Receive(2000);

  if Assigned(StompFrame) then

    WriteLn(StompFrame.GetBody);

  WriteLn;

end;

procedure Example_PointToPoint;

var

  StompPub, StompSub1, StompSub2: IStompClient;

  StompFrame: IStompFrame;

begin

  WriteLn(‘==> Example_PointToPoint‘);

  StompSub1 := StompUtils.NewStomp(‘127.0.0.1‘); // default port

  StompSub2 := StompUtils.NewStomp(‘127.0.0.1‘); // default port

  StompSub1.Subscribe(‘/queue/dummy‘);

  StompSub2.Subscribe(‘/queue/dummy‘);

  StompPub := StompUtils.NewStomp(‘127.0.0.1‘); // default port

  StompPub.Send(‘/queue/dummy‘, ‘First test message on a queue‘);

  StompPub.Send(‘/queue/dummy‘, ‘Second test message on a queue‘);

  StompFrame := StompSub1.Receive(2000);

  if Assigned(StompFrame) then

    WriteLn(StompFrame.Output);

  StompFrame := StompSub1.Receive(2000);

  if Assigned(StompFrame) then

    WriteLn(StompFrame.Output);

  StompFrame := StompSub2.Receive(2000);

  if Assigned(StompFrame) then

    WriteLn(StompFrame.Output);

  StompFrame := StompSub2.Receive(2000);

  if Assigned(StompFrame) then

    WriteLn(StompFrame.Output);

  WriteLn;

end;

begin

  try

    Example_Pub_Subscriber;

    Example_OnePub_TwoSubscriber;

    Example_PointToPoint;

  except

    on E: Exception do

      WriteLn(E.ClassName, ‘: ‘, E.message);

  end;

end.

DelphiStompClient have also a simple listener for asynchronous use. To use the listener you should implement follwing interface:

IStompClientListener = interface

    [‘{C4C0D932-8994-43FB-9D32-A03FE86AEFE4}‘]

    procedure OnMessage(StompFrame: IStompFrame);

  end;

Also a normal form can be used:

 TForm1 = class(TForm, IStompClientListener)

  …

  public

    procedure OnMessage(StompFrame: IStompFrame);  //Called by the stomp receiver

  end;

And then you can manager your message in a simple form’s method.

There are many features in this STOMP client. I’ve tried to respect all the STOMP specs also in the transactions side (http://stomp.codehaus.org/Protocol).

You can find all the source code and the examples at following Google Code Project:
http://code.google.com/p/delphistompclient/

The FreePascal version is actually mantained by Daniel Gaspary, thank Daniel.

时间: 2024-10-03 16:31:31

Delphi消息推送的相关文章

物联网核心协议—消息推送技术演进

消息触达能力是物联网(internet ofthings, IOT)的重要支撑,而物联网很多技术都源于移动互联网.本文阐述移动互联网消息推送技术在物联网中的应用和演进. 一.物联网架构和关键技术 从开发的角度,无线接入是物联网设备端的核心技术,身份设备管理和消息推送技术是物联网云端的核心技术.而从场景体验的角度,除了前者,还要包括手机的前端开发技术. 在上一篇<一张图读懂基于微信硬件平台的物联网架构>博文中,笔者曾用一张大图详细描述了基于微信硬件平台的物联网架构的组成要素.关键场景.和通信协议

atitit.极光消息推送服务器端开发实现推送&#160;&#160;jpush&#160;v3.&#160;总结o7p

atitit.极光消息推送服务器端开发实现推送  jpush v3. 总结o7p 1. 推送所设计到底功能1 1.1. 内容压缩1 1.2. 多引擎1 2. reg  ,设置appkey and pwdkey1 3. 下载server  sdk   v31 4. push推送样例1 5. Code3 1. 推送所设计到底功能 1.1. 内容压缩 1.2. 多引擎 2. reg  ,设置appkey and pwdkey 3. 下载server  sdk   v3 https://github.c

微信小程序开发:设置消息推送

开发设置中,启用并设置消息推送配置后,用户发给小程序的消息以及开发者需要的事件推送,都将被微信转发至该服务器地址中. 不过照着说明去操作,即使按照最简单的明文方式去设置,还是提示Token验证失败.仔细研究说明,其实服务器验证过程很简单,用Get发来一个连接,然后在自己的页面中去检验,不想做也可以先不做,直接返回echostr即可.关键在,怎么返回,开始我还以为必须要按照xml或者json返回,试了半天,其实很简单,清空所有其他输出,直接返回echostr即可. Response.Clear()

redis 学习 五 消息推送

<?php header('content-type:text/html;chaeset=utf-8'); /** * redis实战 * * 发布 * * @example php publish.php */ //发布 $redis = new \Redis(); $redis->connect('127.0.0.1', 6379); $redis->publish('msg', '来自msg频道的推送'); echo "msg频道消息推送成功- \n"; $re

Android消息推送:手把手教你集成小米推送

前言 在Android开发中,消息推送功能的使用非常常见. 为了降低开发成本,使用第三方推送是现今较为流行的解决方案. 今天,我将手把手教大家如何在你的应用里集成小米推送 该文档基于小米推送官方Demo,并给出简易推送Demo 看该文档前,请先阅读我写的另外两篇文章: 史上最全解析Android消息推送解决方案 Android推送:第三方消息推送平台详细解析 目录 1. 官方Demo解析 首先,我们先对小米官方的推送Demo进行解析. 请先到官网下载官方Demo和SDK说明文档 1.1 Demo

MPush开源消息推送系统:简洁、安全、支持集群

引言 由于之前自己团队需要一个消息推送系统来替换JPUSH,一直找了很久基本没有真正可用的开源系统 所有就直接造了个轮子,造轮子的时候就奔着开源做打算的,只是后来创业项目失败一直没时间整理 这一套代码,最近比较闲就拿出来给开源做点贡献. 作为Java版的开源推送系统,MPUSH还是有很多不错的设计的,特别是对想自己搭建一套推送系统的团队 是有很大的借鉴意义的.当然开源出来也是不想曾经做过的工作白白浪费掉,特别希望对这方面有兴趣的同学 来一起把这套东西做的更好,服务更多的用户! 项目主页 http

AngularJS+ASP.NET MVC+SignalR实现消息推送

原文:http://www.mincoder.com/article/4565.shtml 背景 OA管理系统中,员工提交申请单,消息实时通知到相关人员及时进行审批,审批之后将结果推送给用户. 技术选择 最开始发现的是firebase,于是很兴奋的开始倒腾起来.firebase用 起来倒是简单:引用一个js即可,按官网上的教程很快便应用到了项目中.第二天打开项目发现推送功能不好使了,这是为何?最后发现firebase官网打 不开了...难道firebase被google收了也会被天朝给墙掉?也许

Asp.net SignalR 实现服务端消息推送到Web端

原文:http://www.cnblogs.com/wintersun/p/4148223.html 之前的文章介绍过Asp.net SignalR,  ASP .NET SignalR是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.  今天我们来实现服务端消息推送到Web端,   首先回顾一下它抽象层次图是这样的: 实际上 Asp.net SignalR 2 实现 服务端消息推送到Web端, 更加简单. 为了获取更好的可伸缩性, 我们引入消息队列, 看如下

Shuttle ESB实现局域网消息推送

ESB全称Enterprise Service Bus,即企业服务总线.它是传统中间件技术与XML.Web服务等技术结合的产物. ESB的出现改变了传统的软件架构,可以提供比传统中间件产品更为廉价的解决方案,同时它还可以消除不同应用之间的技术差异,让不同的应用服务器协调运作,实现了不同服务之间的通信与整合. 看吧,ESB的功能是如此强大.在java中常用的是Mule ESB,而到了.Net,Shuttle ESB作为一种新生的ESB正在慢慢的被人们所接受.下面通过一个实例讲解Shuttle ES