消息CPMZMQ的ZeroMQ语言间翻译 - JeroMQ - PyZMQ

时间:2017-06-29 23:37:21

标签: java c++ zeromq pyzmq jeromq

在C ++ ZMQ Publisher中,我在message_t中打包一个字符串,如下所示:

int main()
{
     zmq::context_t context(1);
     zmq::socket_t socket(context, ZMQ_PUB);
     socket.bind("tcp://*:5555");
     socket.setsockopt(ZMQ_CONFLATE, 1);
     std::cout << "Server Up and Sending\n";
     while(true)
     {
          std::string str = "Hello from C++!";
          zmq::message_t msg(str.data(), str.length());
          bool ret = socket.send(msg);
          if(ret)
          {
               std::cout << "Sending\n";
          }
     }
     return 0;
}

我想弄清楚如何在JeroMQ(Java ZMQ)中接收;这是我到目前为止所拥有的:

  ZMQ.Context context = ZMQ.context(1);
  ZMQ.Socket socket = context.socket(ZMQ.SUB);
  socket.connect("tcp://localhost:5555");
  socket.subscribe("".getBytes());
  while(true)
  {
        String msg = socket.recvStr();
        System.out.println(msg);
  }

同样在PyZMQ(Python ZMQ)中:

import zmq

context = zmq.Context()
socket = context.socket(zmq.SUB)
address = 'tcp://localhost:5555'
socket.connect(address)
socket.setsockopt_string(zmq.SUBSCRIBE, unicode(''))

print "start"
print "connecting to ", address

while True:
    try:
        msg = socket.recv_string()
        print msg

但是,我的JeroMQ尝试或我的PyZMQ尝试都没有收到我的字符串消息。

2 个答案:

答案 0 :(得分:0)

尝试使用订阅此代码段:

import zmq
import time

port = "5555"

context = zmq.Context()
socket = context.socket(zmq.SUB)

socket.setsockopt(zmq.SUBSCRIBE, '')
socket.setsockopt(zmq.CONFLATE, 1)  # last msg only.
socket.connect("tcp://localhost:%s" % port)  # must be placed after above options.

while 1:
    time.sleep(1)
    data = socket.recv()
    print data

[注意]:

如果不起作用,请在C ++ ZeroMQ发布者中删除以下行:

  

socket.setsockopt(ZMQ_CONFLATE, 1);

答案 1 :(得分:0)

您正在发送C字符串(不带空终止符)。

您正试图接收python或java字符串。

它们可能与declare @filterName nvarchar(200) = N'German Power Trades flagged red' declare @filterSQL nvarchar(4000) = N'AND worst_status=''R'' AND country=''DE'' AND commodity=''EL''' -- @filterName and @filterSQL would come from client INSERT INTO RESULT_FILTER (RESULT_FILTER_NAME, RESULT_FILTER_SQL) VALUES (@filterName, @filterSQL); / recvStr不兼容,并且可能阻止等待字符串结束的详细信息。

只需使用标准recv函数(而不是字符串版本)。