ZeroMQ межъязыковой перевод сообщений CPPZMQ JeroMQ PyZMQ

В 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 не получают мое строковое сообщение.


person Paul McElroy    schedule 29.06.2017    source источник
comment
В версии JeroMQ отсутствует zmq_setsockopt(socket, ZMQ_SUBSCRIBE) (не знаю, каков правильный синтаксис). Возможно, выполнение socket.subscribe делает то же самое, я не знаю.   -  person Henri Menke    schedule 30.06.2017
comment
Я считаю, что socket.subscribe("".getBytes()); является эквивалентом JeroMQ CPPZMQ: socket.setsockopt(ZMQ_SUBSCRIBE, "", 0); Эквивалент PyZMQ: socket.setsockopt_string(zmq.SUBSCRIBE, unicode(''))   -  person Paul McElroy    schedule 30.06.2017
comment
Комбинация C ++ и Python мне подходит. Я использую Python3 и заменяю unicode('') на u"". (Конечно, я также добавил ветку except, которая отсутствует в вопросе)   -  person Henri Menke    schedule 30.06.2017
comment
В прошлом у меня было несколько странных несоответствий libzmq 3.x и 4.x для сокетов pub / sub. В зависимости от того, как вы создаете свои привязки к языкам, отличным от C, они могут в конечном итоге использовать старые пакеты. Также возможно, что реальная проблема в то время заключалась в том, что сторона PyZMQ Python была фактически создана для 4.x, но в итоге она динамически связывалась с версией libzmq.so 3.x или наоборот. Это даже означало, что функция версии вернула правильную версию, но все еще была привязана к неправильному общему объекту.   -  person cnettel    schedule 30.06.2017


Ответы (2)


Попробуйте использовать этот фрагмент кода для подписки с помощью pyzmq:

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);

person Benyamin Jafari    schedule 30.07.2018

Вы отправляете строку C (без нулевого завершения).

Вы пытаетесь получить строку Python или Java.

Они, вероятно, несовместимы с recvStr / recv_string и, вероятно, блокируют ожидание подробностей о том, где заканчивается строка.

Просто используйте стандартные функции recv (а не строковые версии).

person James Harvey    schedule 31.07.2018