zeromq发送文件到服务器,将zeromq套接字连接到redis服务器以进行数据传输?

我想将服务器上的消息(ZMQ_ROUTER套接字,处理多个客户端)传输到redis服务器以用于存储目的。我听说,redis不会说ZMQ。所以如果不搭桥,就不可能实现。我接受你的建议。在哪里看?将zeromq套接字连接到redis服务器以进行数据传输?

//负载平衡的多线程版服务器:

#include "zhelpers.hpp"

#include

#include "zmq.hpp"

#include

#include

#include

#include "datamsg.pb.h"

using namespace google::protobuf::io;

bool verify(std::string str, std::vector<:string> &s)

{

for(int q=0;q

{

if(s.at(q)==str.substr(0,4)){

s.push_back(str.substr(4,str.length()-1));

return true;

}

}

return false;

}

// Basic request-reply client using REQ socket

static void * worker_thread(void *arg) {

zmq::context_t context(1);

zmq::message_t worker_receive;

datamsg worker_parsed;

zmq::socket_t worker(context, ZMQ_REQ);

s_set_id(worker); // Makes tracing easier

worker.connect("ipc://backend.ipc");

// Tell backend we're ready for work

s_send(worker, "READY");

while (1) {

// Read and save all frames until we get an empty frame

worker.recv(&worker_receive);

worker_parsed.ParseFromArray(worker_receive.data(), worker_receive.size());

// printing after parsing.........

s_sendmore (worker, worker_parsed.destination());

s_sendmore (worker, "");

worker.send(worker_receive);// Here I sent the same structure back

}

return (NULL);

}

int main (int argc, char *argv[]) {

// Prepare our context and sockets

zmq::context_t context(1);

zmq::socket_t frontend (context, ZMQ_ROUTER);

zmq::socket_t backend (context, ZMQ_ROUTER);

zmq::socket_t verification (context, ZMQ_REP);

verification.bind("tcp://*:5557");

std::vector<:string> s;

s.reserve(10);

s.push_back("cli4");

frontend.bind("tcp://*:5559");

backend.bind("ipc://backend.ipc");

zmq::message_t frontend_received;

zmq::message_t front_get;

int worker_nbr;

for(worker_nbr = 0; worker_nbr < 3; worker_nbr++) {

pthread_t worker;

pthread_create(&worker, NULL, worker_thread, NULL);

}

std::queue<:string> worker_queue;

while (1) {

// Initialize poll set

zmq::pollitem_t items[] = {

// Always poll for worker activity on backend

{ backend, 0, ZMQ_POLLIN, 0 },

// Poll front-end only if we have available workers

{ frontend, 0, ZMQ_POLLIN, 0 },

//Poll for new customer for verification of client refrence ID

{verification,0,ZMQ_POLLIN,0 }

}; zmq::poll (items, 3, -1);

if (items [0].revents & ZMQ_POLLIN) { // Handle worker activity on backend

// Queue worker address for LoadBalanced routing

worker_queue.push(s_recv (backend));

// Second frame is empty

std::string empty = s_recv (backend);

assert (empty.size() == 0);

// Third frame is READY or else a client reply address

std::string client_addr = s_recv (backend);

// If client reply, send rest back to frontend

if(client_addr.compare("READY") != 0) {

std::string empty = s_recv (backend);

assert (empty.size() == 0);

backend.recv(&frontend_received);

s_sendmore (frontend, client_addr);

s_sendmore (frontend, "");

frontend.send(frontend_received);

//frontend.close();

}

}

if (items [1].revents & ZMQ_POLLIN) {

// Client request is [address][request]

std::string client_addr = s_recv (frontend);

frontend.recv(&front_get);

std::string worker_addr = worker_queue.front();

worker_queue.pop();

s_sendmore (backend, worker_addr);

s_sendmore (backend, "");

backend.send(front_get);

}

if (items [2].revents & ZMQ_POLLIN) {

std::string refrence=s_recv(verification);

if(verify(refrence,s)){

s_send(verification,"OK");

std::cout<

}

else s_send(verification,"Verification Failed!");

}

}

sleep (1);

return 0;

}

+0

Apache Camel是一个在不同协议之间构建总线的好项目。 –

2014-09-22 08:29:58

+0

为什么您的应用程序需要使用ZMQ,而不是使用redis模块/库/等直接与redis对话?如果redis服务器位于另一台主机上,您需要通过某种方式首先将数据发送给该主机,那么通常您会为该主机编写一个客户机应用程序,然后该应用程序会原生地与Redis进行通信。 –

2014-09-22 13:45:17

+0

@Jason我需要通过redis服务器记录所有的消息。 zmq和redis都本地运行(localhost)但是我找不到从zmq套接字与redis进行通信的方式。我是否需要编写一个单独的客户端? –

2014-09-22 18:53:14

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值