提出假定
我们假定你使用的至少是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
补充:综合编程 , 其他综合 ,