rainbowzc

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::

   最近做后台发现很多地方需要队列,我用东西一般有两个要求:
      1) 够傻够简单
      2) 有源码,能看又能改
    最后相中了0mq,下面介绍如何安装和写个简单的例子。
一. linux平台:ubuntu&python。 

安装
软件下载页面:
http://www.zeromq.org/intro:get-the-software
1. prerequisites安装:
sudo apt-get install libtool autoconf automake uuid-dev build-essential
2. 下载解压安装包:
wget http://download.zeromq.org/zeromq-2.1.11.tar.gz
tar -zxf zeromq-2.1.11.tar.gz
3. 编译安装:
./configure & make
sudo make install
4. 刷新库:
sudo ldconfig
5. 安装python开发环境:
sudo apt-get install python-dev python-setuptools
6. 安装python的0mq库:
简单安装:
sudo easy_install pyzmq (可能失败,鳖在这里就O了)
手动安装:
wget https://github.com/downloads/zeromq/pyzmq/pyzmq-2.1.11.zip
unzip pyzmq-2.1.11.zip
cd pyzmq-2.1.11
sudo python setup.py install --zmq=/usr/local

简单例子:hello world

复制代码
#encoding=utf-8
#
Hello World client in Python
#
Connects REQ socket to tcp://localhost:5555
#
Sends "Hello" to server, expects "World" back
#
import zmq

context = zmq.Context()

#欢迎信息
print "正在连接hello world服务器"
socket = context.socket(zmq.REQ) #socket 模式通讯
socket.connect ("tcp://localhost:5555") # 连接到本地的5555端口

#发出10次请求,每次等待服务器的一个响应
for request in range (1,10):
print "客户端发送请求", request,"..."
socket.send ("土鳖,你好吗?")

#获取服务器响应
message = socket.recv()
print "客户端收到回复", request, "[", message, "]"
复制代码

 

复制代码
#encoding=utf-8
#
Hello World server in Python
#
Binds REP socket to tcp://*:5555
#
Expects "Hello" from client, replies with "World"
#
import zmq
import time

context = zmq.Context()
socket = context.socket(zmq.REP) #socket模式通讯
socket.bind("tcp://*:5555") #监听5555端口,等待请求

while True:
#等待从客户端发送的请求
message = socket.recv()
print "服务器收到请求: ", message

#干点啥,鳖喜欢睡,所以睡会
time.sleep (1)

#向客户端发送请求
socket.send("土鳖不好:(")
复制代码

运行命令:
python hwserver.py & python hwclient.py

运行结果:

正在连接hello world服务器
客户端发送请求 1 ...
服务器收到请求: 土鳖,你好吗?
客户端收到回复 1 [ 土鳖不好:( ]
客户端发送请求 2 ...
服务器收到请求: 土鳖,你好吗?
客户端收到回复 2 [ 土鳖不好:( ]
客户端发送请求 3 ...
。。。

注意: 运行第二次必须关闭服务器:pkill python, 因为客户端跑完10个请求就自动退出了,服务器会一直运行。

相关资料:
pyzmq 例子:https://github.com/imatix/zguide/tree/master/examples/Python
pyzmq 文档: http://zeromq.github.com/pyzmq/ 

二. windows平台:windows7&C#。     

1. 在页面http://www.zeromq.org/bindings:clr
下载clr版本的源代码。
下载链接:http://github.com/zeromq/clrzmq
2. 解压后打开src目录下面的clrzmq.sln,然后生成整个解决方案。
3. 新建一个C#控制台应用程序ZmqHello。
从src\packages\libzmq.3.1.1-beta1\Content\lib\x86目录下复制libzmq.dll和libzmq.dll.pdb到ZmqHello
项目的bin\Debug目录下。这个库是本机代码,clr通过interop与之通讯。如果你的系统是64位,复制x64目录下的文件。
4. 项目引用中添加.net版本的zmq库clrzmq.dll,所在目录是src\ZeroMQ\bin\Debug。
5. 编写hello world程序,下面是客户端和服务器代码:

复制代码
    class Program
{
static void Main(string[] args)
{
//构建服务器和客户端线程
var client = new Thread(ClientThread);
var server = new Thread(ServerThread);

//开始执行线程
server.Start();
client.Start();

//等待线程执行完毕
server.Join();
client.Join();
}

private static void ClientThread()
{
Thread.Sleep(10);

using (var context = ZmqContext.Create())
using (var socket = context.CreateSocket(SocketType.REQ))
{
//连接服务器
socket.Connect("tcp://localhost:8989");
//发送消息
string msg = "土鳖,你好吗";
socket.SendFrame(new Frame(Encoding.UTF8.GetBytes(msg)));
Console.WriteLine("客户端发送请求:" + msg);
var buffer = new byte[100];
int size = socket.Receive(buffer);
string recvMsg = Encoding.UTF8.GetString(buffer, 0, size);
Console.WriteLine("客户端收到回复:" + recvMsg);
}
}

private static void ServerThread()
{
//创建上下文和socket
using (var context = ZmqContext.Create())
using (var socket = context.CreateSocket(SocketType.REP))
{
//服务器监听8989端口
socket.Bind("tcp://*:8989");
//接收客户端请求
Frame request = socket.ReceiveFrame();
string msg = Encoding.UTF8.GetString(request);
Console.WriteLine("服务端收到请求:" + msg);

string sendMsg = "土鳖不好:(";
socket.SendFrame(new Frame(Encoding.UTF8.GetBytes(sendMsg)));
Console.WriteLine("服务端发送回复:" + sendMsg);
}
}
}
复制代码

6. 运行后,结果如下:

 

  codeplex上面还有个更强大的库:http://zeromq.codeplex.com/
  有兴趣的同学可以研究一下。

      更复杂的例子在clrmq解决方案(刚才下载解压后打开的那个)的Tests目录下。
      文档没找到专门针对C#的,只有一个通用的:
      http://zguide.zeromq.org/page:all 
    手册也没找到专门的,下面是c的,凑活着看吧:
  http://api.zeromq.org/ 

posted on 2013-10-02 19:42  ct  阅读(760)  评论(0编辑  收藏  举报