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
代码片段如下:
这样一个简单的网络程序就写好了,无需你对网络协议和网络编程多熟悉就可以完成,非常简单实用,大家有兴趣可以看下。后面我会对现有的几个网络库慢慢研究的(ZMQ RakNet IOCP LibEvent ICE等),希望大家继续关注!
本文固定链接: http://www.cppfans.org/1018.html | C++爱好者博客
Ø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++爱好者博客
相关文章推荐
- [网络开发]ZeroMQ初体验——hello world
- zeroMQ初体验-15.应答模式进阶(一)-数据的封装
- zeroMQ初体验-32.发布/订阅模式进阶-克隆模式-上
- zeromq客户端服务器hello world
- zeroMQ初体验-16.应答模式进阶(二)-定制路由1
- zeroMQ初体验-34.发布/订阅模式进阶-克隆模式-下,结言
- zeroMQ初体验-17.应答模式进阶(三)-定制路由2
- zeroMQ初体验-18.应答模式进阶(四)-定制路由3
- zeroMQ初体验-1.简介及C/S模式
- zeroMQ初体验-19.应答模式进阶(五)-异步式应答
- zeroMQ初体验-2.发布订阅模式(pub/sub)
- zeroMQ初体验-20.应答模式进阶(六)-多对多路由模式
- zeroMQ初体验-3.分而治之模式(push/pull)
- zeroMQ初体验-21.应答模式进阶(七)-云计算
- zeroMQ初体验-4.传教(为什么要用ZeroMQ?)
- zeroMQ初体验-23.可靠性-懒惰的海盗模式
- 我的Go语言学习之旅二:入门初体验 Hello World
- zeroMQ初体验-5.高级教程初涉
- zeroMQ初体验-24.可靠性-简单的海盗模式