zoukankan      html  css  js  c++  java
  • 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

    复制代码
    #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/ 

  • 相关阅读:
    POJ3613 k边最短路
    洛谷4014最大/小费用最大流
    POJ1734无向图求最小环
    洛谷4013数字梯形
    洛谷4147玉蟾宫
    洛谷4145上帝造题的七分钟2
    洛谷4092 树
    Nginx动静分离-tomcat
    nginx之Geoip读取地域信息模块
    Nginx与Lua开发
  • 原文地址:https://www.cnblogs.com/rainbowzc/p/3349591.html
Copyright © 2011-2022 走看看