当前位置:编程学习 > 网站相关 >>

ZeroMQ指南-第1章-基础

提出假定
我们假定你使用的至少是3.2发行版ØMQ。我们假定你在使用Linux box或类似的东西。我们假定你能读C代码,这是几乎全部示例的默认语言。我们假定当我们写下常量PUSH或SUBSCRIBE时你能够想象到它们实际名称是ZMQ_PUSH或ZMQ_SUBSCRIBE,当编程语言需要时。
获取示例
示例代码位于一个公共GitHub版本库中。获取全部示例的最简单方法是克隆这个版本库:
[plain] 
git clone --depth=1 git://github.com/imatix/zguide.git  
然后浏览examples子目录。你会找到各种语言的示例。如果没有你使用的语言,我们鼓励你提交一份翻译。如此,这篇文章才变得这么有用,感谢许多人的努力。所有示例遵循MIT/X11版权。
求则必得
那么我们开始看代码。我们理所当然从HelloWorld示例开始。做一个客户端和服务器。客户端发送“Hello”到服务器,服务器回答“World”。下面是C语言的服务器,打开了一个ØMQ套接字端口5555,读取其中请求,并应答“World”到每个请求:
[cpp]  
//  
// Hello World server  
// Binds REP socket to tcp://*:5555  
// Expects "Hello" from client, replies with "World"  
//  
#include <zmq.h>  
#include <stdio.h>  
#include <unistd.h>  
#include <string.h>  
  
int main (void)  
{  
    void *context = zmq_ctx_new ();  
  
    // Socket to talk to clients  
    void *responder = zmq_socket (context, ZMQ_REP);  
    zmq_bind (responder, "tcp://*:5555");  
  
    while (1) {  
        // Wait for next request from client  
        zmq_msg_t request;  
        zmq_msg_init (&request);  
        zmq_msg_recv (&request, responder, 0);  
        printf ("Received Hello\n");  
        zmq_msg_close (&request);  
  
        // Do some 'work'  
        sleep (1);  
  
        // Send reply back to client  
        zmq_msg_t reply;  
        zmq_msg_init_size (&reply, 5);  
        memcpy (zmq_msg_data (&reply), "World", 5);  
        zmq_msg_send (&reply, responder, 0);  
        zmq_msg_close (&reply);  
    }  
    // We never get here but if we did, this would be how we end  
    zmq_close (responder);  
    zmq_ctx_destroy (context);  
    return 0;  
}  www.zzzyk.com
hwserver.c:Hello World server
图2 - 请求-应答
请求-应答套接字是一前一后紧密相连的。客户端先发出zmq_msg_send()然后是zmq_msg_recv(),依次循环(或单次如果必要)。其它任何顺序(例如一行发送两个消息)都将导致send或recv调用返回-1代码。同样的,服务端依次先发出zmq_msg_recv()然后是zmq_msg_send(),频率则因其所需。
ØMQ使用C作为参考语言,同时也是我们在示例中使用的主要语言。如果你在线浏览,示例下方的链接可带你到其它编程语言版本。让我们比较一下服务器代码的C++版本。
[cpp] 
//  
// Hello World server in C++  
// Binds REP socket to tcp://*:5555  
// Expects "Hello" from client, replies with "World"  
//  
#include <zmq.hpp>  
#include <string>  
#include <iostream>  
#include <unistd.h>  
  
int main ()  
{  
    // Prepare our context and socket  
    zmq::context_t context (1);  
    zmq::socket_t socket (context, ZMQ_REP);  
    socket.bind ("tcp://*:5555");  
  
    while (true) {  
        zmq::message_t request;  
  
        // Wait for next request from client  
        socket.recv (&request);  
        std::cout << "Received Hello" << std::endl;  
  
        // Do some 'work'  
        sleep (1);  
  
        // Send reply back to client  
        zmq::message_t reply (5);  
        memcpy ((void *) reply.data (), "World", 5);  
        socket.send (reply);  
    }  
    return 0;  
}  
hwserver.cpp:Hello World server
你能看到C和C++版的ØMQ API非常类似。某种语言如PHP甚至可以隐藏更多细节,让代码更加容易阅读。
[php] 
<? php  
/* 
* Hello World server 
* Binds REP socket to tcp://*:5555 
* Expects "Hello" from client, replies with "World" 
* @author Ian Barber <ian(dot)barber(at)gmail(dot)com> 
*/  
  
$context = new ZMQContext(1);  
  
// Socket to talk to clients  
$responder = new ZMQSocket($context, ZMQ::SOCKET_REP);  
$responder->bind("tcp://*:5555");  
  
while (true) {  
    // Wait for next request from client  
    $request = $responder->recv();  
    printf ("Received request: [%s]\n", $request);  
  
    // Do some 'work'  
    sleep (1);  
  
    // Send reply back to client  
    $responder->send("World");  
}  
hwserver.php:Hello World server
这是客户端代码:
hwclient: Hello World client in C
[cpp]  
//  
// Hello World client  
// Connects REQ socket to tcp://localhost:5555  
// Sends "Hello" to server, expects "World" back  
//  
#include <zmq.h>  
#include <string.h>  
#include <stdio.h>  
#include <unistd.h>  
  
int main (void)  
{  
    void *context = zmq_ctx_new ();  
  
    // Socket to talk to server  
    printf ("Connecting to hello world server…\n");  
    void *requester = zmq_socket (context, ZMQ_REQ);  
    zmq_connect (requester, "t
补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,