0mq 入门 (转)
最近做后台发现很多地方需要队列,我用东西一般有两个要求:
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
![](https://common.cnblogs.com/images/copycode.gif)
#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, "]"
![](https://common.cnblogs.com/images/copycode.gif)
![](https://common.cnblogs.com/images/copycode.gif)
#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("土鳖不好:(")
![](https://common.cnblogs.com/images/copycode.gif)
运行命令:
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程序,下面是客户端和服务器代码:
![](https://common.cnblogs.com/images/copycode.gif)
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(); 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[];
int size = socket.Receive(buffer);
string recvMsg = Encoding.UTF8.GetString(buffer, , 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);
}
}
}
![](https://common.cnblogs.com/images/copycode.gif)
6. 运行后,结果如下:
codeplex上面还有个更强大的库:http://zeromq.codeplex.com/
有兴趣的同学可以研究一下。
更复杂的例子在clrmq解决方案(刚才下载解压后打开的那个)的Tests目录下。
文档没找到专门针对C#的,只有一个通用的:
http://zguide.zeromq.org/page:all
手册也没找到专门的,下面是c的,凑活着看吧:
http://api.zeromq.org/
0mq 入门 (转)的更多相关文章
- Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求
上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- Oracle分析函数入门
一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...
- Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数
上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...
- Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数
上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...
- Angular2入门系列教程4-服务
上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...
- wepack+sass+vue 入门教程(三)
十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...
- wepack+sass+vue 入门教程(二)
六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...
- wepack+sass+vue 入门教程(一)
一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...
随机推荐
- Java虚拟机工作原理简介
1. Java 文件执行过程 2. 运行数据区域 Runtime Data Areas:当运行一个JVM示例时,系统将分配给它一块内存区域(这块内存区域的大小可以设置的),这一内存区域由JVM自己来管 ...
- Android中线程通信的方式
Android 跨线程通信 android 中是不允许在主线程中进行 网络访问等事情的因为UI如果停止响应5秒左右的话整个应用就会崩溃,到Android4.0 以后 Google强制规定,与网络相关的 ...
- VA插件突然不能使用,彈出“the security key for....”
昨天打開VS莫名其妙地彈出下面的錯誤框: "the security key for this program currently stored on your system does no ...
- 配置lambda
=========== 添加 apply plugin: 'me.tatarka.retrolambda' 添加 compileOptions { sourceCompatibilit ...
- NOIP练习赛题目3
魔兽争霸 难度级别:C: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 小x正在销魂地玩魔兽他正控制着死亡骑士和n个食尸鬼(编号1-n)去打 ...
- [POI2013]Łuk triumfalny
[POI2013]Łuk triumfalny 题目大意: 一棵\(n(n\le3\times10^5)\)个结点的树,一开始\(1\)号结点为黑色.\(A\)与\(B\)进行游戏,每次\(B\)能选 ...
- 概率dp总结
终于做到概率dp题了,开个总结帖记录一下 首先是几篇论文:有关概率和期望问题的研究 做了这么多题,实际上没什么特别好总结的,就是搞清状态和转移,顺着写就行了,和基本dp差不多 概率是由过去到现在dp[ ...
- .Net中常用的重要的第三方组件
RSS.NET.dll RSS.NET是一款操作RSS feeds的开源.NET类库.它为解析和编写RSS feeds提供了一个可重用的对象模型.它完全兼容RSS 0.90, 0.91, 0.92, ...
- RabbitMQ简单使用
环境搭建: RabitMQ是用Elang编写的,虽然Elang本身是跨平台的,但也同时意味着搭建Rabit环境需要首先配置Elang环境.配置RabitMQ的网上教程还比较多的: windows 下 ...
- Android app开发中用户协议(使用条款)文字自己主动换行
用户协议(使用条款)文字自己主动换行处理 转载请注明出处:http://blog.csdn.net/u012301841/article/details/46648821 我们在开发app的时候.常常 ...