最近做后台发现很多地方需要队列,我用东西一般有两个要求:
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。
从srcpackageslibzmq.3.1.1-beta1Contentlibx86目录下复制libzmq.dll和libzmq.dll.pdb到ZmqHello
项目的binDebug目录下。这个库是本机代码,clr通过interop与之通讯。如果你的系统是64位,复制x64目录下的文件。
4. 项目引用中添加.net版本的zmq库clrzmq.dll,所在目录是srceroMQinDebug。
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/