您的位置:首页 > 其它

ZeroMQ初体验——hello world

2013-01-29 00:41 351 查看
群里最近在说网络库的东西,群主推荐说可以看看ØMQ,说非常精简,而且支持多种语言,非常高效率,于是下载来看看。

ØMQ官网 www.zeromq.org

Guide还没看完,大概先看了下,觉得很精简,而且写的非常清里面包含了多种设计模式的应用,建议大家有时间看看。

所有网络交互所使用的API实际上是Berkeley套接字(BSD) 。这个源自1980年代早期的协议是TCP/IP协议的最原始实现。而且可以说,在当今各操作系统中,它是受到最广泛支持的API,也是这些操作系统的核 心组件之一。人们对BSD套接字的了解较多的是点对点的连接。点对点连接需要显式地建立连接、销毁连接、选择协议(TCP/UDP)和处理错误等。一旦你 解决了以上所有问题,你就进入应用协议层(如HTTP)的世界了,这里需要的是组帧、缓存和处理逻辑等。换言之,编写高性能网络协议的应用程序一点儿也不 复杂。

如果我们能对各种套接字类型、连接处理、帧、甚至路由的底层细节进行抽象,这不是件很好的事情吗?这正是ZeroMQ(ØMQ/ZMQ)网络库的由来:“它提供一些跨多种传输协议(如进程内通讯、IPC、TCP和广播)的套接字供你使用。你可使用多种方式实现N对N的套接字连接,譬如:扇出、发布订阅、任务分发以及请求响应。”

ØMQ是网络栈中新的一层,它是个可伸缩层,分散在分布式系统间。因此,它可支持任意大的应用程序。ØMQ不是简单的点对点交互,相反,它定义了分布式系统的全局拓扑。ØMQ应用程序没有锁,可并行运行。此外,它可在多个线程、内核和主机盒之间弹性伸缩。

ZeroMQ交互是面向消息的。它将人们每天为应用程序周而复始地进行的例行消息处理封装起来。这意味着如果当客户端套接字发送一条150KB大小的消息时,服务端套接字无需显式处理任何缓存(buffer)或组帧,即能接接收到一条完整而相同的消息。
ZeroMQ套接字与传输协议无关:对于任何协议,只有单一且统一的发送消息和接收消息API。缺省情况下支持进程内通讯、IPC、广播和TCP。此外,协议间切换非常简单,仅需更改连接字符串的前缀即可。
ZeroMQ套接字能感知路由和网络拓扑。因为我们不再需要显示地管理点对点的连接状态——在上面我们已经看到,所有这些都已经由 ZeroMQ库封装好——所以单个ZeroMQ套接字可以绑定两个独立的端口并监听他们的入站请求消息;也可使用一个API调用向两个独立的套接字发送数 据。

TCP:ZeroMQ基于消息,消息模式,而非字节流。
XMPP:ZeroMQ更简单、快速、更底层。Jabber可建在ØMQ之上。
AMQP:完成相同的工作,ZeroMQ要快100倍,而且不需要代理(规范更简洁——少278页)
IPC:ZeroMQ可以跨多个主机盒,而非单台机器。
CORBA:ZeroMQ不会将复杂到恐怖的消息格式强加于你。
RPC:ZeroMQ完全是异步的,你可以随时增加/删除参与者。
RFC 1149:ZeroMQ比它快多了!
29west LBM:ZeroMQ是自由软件!
IBM低延迟:ZeroMQ是自由软件!
Tibco:仍然是自由软件!

看了第一部分的guide,试了试最简单的hello world,觉得非常好用,完全可以用来做聊天软件或者游戏的消息内核。

下载ØMQ最新版本,3.0.2Beta版本,zeromq-3.0.2\builds\msvc路径下有一个msvc.sln文件,这个是VS2008的解决方案文件,我用的是VS2010,转换完后编译,我自己按照Debug和Release分开编译生成的,方便工程使用,特别强调下,编译完最外层文件夹Lib中会生成一个libzmq.dll的文件,使用该库编译的程序必须得有该链接库才可以运行。(不知道为什么官网要这样做,直接变成Lib文件,然后使用就可以了,还得转两次,如果需要Lib文件的同学可以自己将他编译为Lib文件。)

在自己工程中添加头文件和库文件路径,然后开始编写测试代码。

建立两个工程一个为ZMQServer 一个为ZMQTest

代码片段如下:

// hello world server
#include "zmq.h"
#include "zmq.hpp"
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
std::cout << "---------Test Client Start... (C) www.cppfans.org---------" <<std::endl;
std::cout << "---------------------Author:eliteYang---------------------" <<std::endl;

void* context = zmq_init( 1 );
void* responder = zmq_socket( context, ZMQ_REP );
zmq_bind( responder, "tcp://*:5555" );

while ( true )
{
zmq_msg_t msg;
zmq_msg_init( &msg );
zmq_recv( responder, &msg, 0 );
std::cout << "Recv Hello world! from Client" << std::endl;
zmq_msg_close( &msg );

Sleep( 100 );
}
zmq_close (responder);
zmq_term (context);
system( "Pause" );
return 0;
}


// hello world client
#include "zmq.h"
#include "zmq.hpp"
#include <stdio.h>
#include <iostream>
#include <string>

int _tmain(int argc, _TCHAR* argv[])
{
std::cout << "---------Test Client Start... (C) www.cppfans.org---------" <<std::endl;
std::cout << "---------------------Author:eliteYang---------------------" <<std::endl;

void* context = zmq_init( 1 );
void* responder = zmq_socket( context, ZMQ_REQ );
int nRet = zmq_connect( responder, "tcp://localhost:5555" );
if ( nRet == 0 )
{ std::cout << "----------------Client Connect Server OK------------------" <<std::endl; }

for ( int i = 0; i < 10; ++i )
{
zmq_msg_t msg;
zmq_msg_init_size( &msg, 32 );
memcpy( zmq_msg_data( &msg ), "Hello world!",  15);
zmq_send( responder, &msg, 0 );
zmq_msg_close( &msg );
std::cout << "Send Msg" << i << "Times" << std::endl;
}

zmq_close (responder);
zmq_term (context);
system( "Pause" );
return 0;
}


这样一个简单的网络程序就写好了,无需你对网络协议和网络编程多熟悉就可以完成,非常简单实用,大家有兴趣可以看下。后面我会对现有的几个网络库慢慢研究的(ZMQ RakNet IOCP LibEvent ICE等),希望大家继续关注!

本文固定链接: http://www.cppfans.org/1018.html | C++爱好者博客
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: