0MQ绑定Delphi版-说明

0MQ绑定Delphi版

这是一份ZMQ绑定。测试环境Delphi7,BDS2006,FPC 2.6.0(目前仅Window)。

概述

程序包中含有一个dll的wrapper(zmq.pas),和一个高层API(zmqapi.pas)。

它应该能够工作于 ZMQ 2.2.0,和 3.2.0rc1(实验性)。要使用 v3.2 的 dll,在zmq.inc中定义zmq3({$define zmq3})。dll来自于官方发行版

使用

你应该使用高层API,那会节省你大量时间,而且附带效果是代码也将更容易阅读。

首先,你应该创建一个上下文

context := TZMQContext.Create; 

有很多种套接字类型,参见指南,每种都有一个常量。要创建例如一个REP套接字,这么写:

socket := context.Socket( stRep );

// 绑定套接字
socket.bind( 'tcp://*:5555' );

// 连接套接字
socket.connect( 'tcp://localhost:5555' );

API中有很多中方法来发送消息。你可以发送单份,或多份消息,阻塞或非阻塞(v3中称为dontwait不等待)模式。

// 阻塞模式(默认)发送一个字符串就像这么简单:
socket.send( 'Hello' );

// 或者用非阻塞模式
socket.send( 'Hello', [rsfNoBlock] );
// 这种情况下如果消息无法入队则将抛出一个EZMQException异常,
// 异常类型为EAGAIN。

// 从stream发送数据(别忘了设置stream的位置到读取位置)
socket.send( stream, size );

// 发送多段消息。
// 多个字符串:
socket.send( ['Hello','World'] );

// 这等同于:
socket.send( 'Hello', [rsfSndMore] );
socket.send( 'World' );

// 或者使用TStrings。
tsl := TStringList.Create;
tsl.Add( 'Hello' );
tsl.Add( 'World' );
socket.send( tsl );
tsl.Free;

接收消息就像这么容易:

msize := socket.recv( msg );
// 新的消息到了msg中,而msize持有消息的长度

// 到一个stream中
msize := socket.recv( stream );

// 读取多段消息
tsl := TStringList.Create;
mcount := socket.recv( tsl );
// 这将会添加多个消息的部分到字符串列表,并返回接收的消息数量。

CTRL+C的处理

这是个小技巧。在Windows中信号处理与posix系统有所不同。阻塞调用不会接收到SIGINT,只会持续的阻塞。要克服这个问题,已安装的处理器终止了上下文,所以阻塞调用例如recvpoll,等等...将接收到ETERM。这仅在Windows。

如果你将你的无限循环代码写为这样,你可以很干净的终止。

while not context.Terminated do
try
  socket.recv( msg );
except
  // 处理异常,或者
  context.Terminate;
end;

context.Free;

轮询

轮询可以工作在两种不同方式,让我们称第一种为同步,第二种为异步方式。异步版本创建了一个线程,在其中做轮询。

  • 同步
// 创建上下文
context := TZMQContext.Create;
socket := context.Socket( stDealer );
socket.connect( address );

// 创建轮询器。参数true告诉轮询器使用同步轮询
poller := TZMQPoller.Create( true );

// 注册套接字。
poller.register( socket, [pePollIn] );

timeout := 100; // 100ms
while not context.Terminated do
begin
  rc := poller.poll(timeout);
  if rc > 0 then
    do something...
end;

poller.Free;
socket.Free;
context.Free;

  • 异步方式

这个实现使用了一种reactor模式,轮询器启动了一个新的线程,并在类和创建的线程之间创建了一对套接字连接。所以这个轮询器的实现不是线程安全的,不要在不同线程中去注册、反注册套接字。

procedure TMyClass.pollerEvent( socket: TZMQSocket; event: TZMQPollEvents );
  begin
    do something...
  end;

// 创建上下文。
context := TZMQContext.Create;

socket := context.Socket( stDealer );
socket.connect( address );

// 创建轮询器。第二个参数可以为nil,此时轮询器会创建自己的上下文。
poller := TZMQPoller.Create( false, context );

poller.onEvent := pollerEvent;

// 注册套接字。如果第三个参数为true,注册将阻塞直到套接字注册完毕。
poller.register( socket, [pePollIn], false );


监视套接字(仅在v3.2可用)

// 像这样定义一个回调
procedure TMyClass.MonitorCallback( event: TZMQEvent );
begin
  // do something.
end;

// 注册这个回调
socket.RegisterMonitor( MonitorCallback, cZMQMonitorEventsAll );

// MonitorCallback将会在由RegisterMonitor创建的分离的线程中被调用。

// 你可以这么调用来反注册监视。
socket.DeRegisterMonitor; 

示例

示例位于 zguide examples/Delphi 目录.

变更

  • New poller class
  • poll function of TZMQPoller has a new optional parameter "pollCount".
  • Upgrade dll-s to v3.2.2 RC2
  • New monitoring logic implemented.
  • Default ZMQ version for the binding is now3.2 ( can switch back to 2.2 by not defining zmq3 in the zmq.inc file )

作者

以下为项目的贡献人员:

	Balazs Varga <bb.varga@gmail.com> 
	Stathis Gkotsis<stathis.gkotsis@gmail.com>
	Stephane Carre <scarre.lu@gmail.com>

版权

遵循 GNU Lesser General Public License (LGPL) 条款将被授权自由使用此软件。细节请参看包含在发行内容中的文件COPYING.LESSER


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ZeroMQ—指导 由iMatix公司的首席执行官Pieter Hintjens 编写。感谢Bill Desmarais, Brian Dorsey, CAF, Daniel Lin, Eric Desgranges, Gonzalo Diethelm, Guido Goldstein, Hunter Ford, Kamil Shakirov, Martin Sustrik, Mike Castleman, Naveen Chawla, Nicola Peduzzi, Oliver Smith, Olivier Chamoux, Peter Alexander, Pierre Rouleau, Randy Dryburgh, John Unwin, Alex Thomas, rofl0r, Mihail Minkov, Jeremy Avnet, Michael Compton, and Zed Shaw的贡献,也感谢Stathis Sideris,因为Ditaa.。 请对所有的意见和勘误表进行问题跟踪。这个本覆盖了0MQ2.0的本,发表于周二2010年11月9日,9时32分19秒。 第一章——基础的东西 修理(fixing)这个世界 怎么解释0MQ?有些人会说它的所有美好的事情。它是类固醇(steroids)上的套接字。它像有路由的邮箱。它很快。别人想分享它的启蒙,当这一切变得越来越明显,人们开始顿悟了。事情变得更简单。再也不复杂了。它打开了人们的思维。其他人喜欢通过做比较的方式来解释。它更小,更简单,但是看起来仍然很熟悉。就我个人而言,我希望回忆起我们为什么要开发0MQ,因为,这是读者们也很想知道的问题。 编程是装扮成艺术的科学,因为我们中的大多数不了解软件的物理过程。如果学过这方面的知识的话,也学的很少。软件的物理过程不是算法,数据结构,语言和抽象。这些只是我们研发,使用,然后扔掉的工具。软件真正的物理过程实际上是人们的思维过程。 ……
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值