Хобрук: Ваш путь к мастерству в программировании

Публикация/подписка ZeroMQ с подписчиком на PHP, который не может получать сообщения от издателя на С#

Я использую ZeroMQ для облегчения среды публикации/подписки, которая мне нужна. И pub, и sub работают на локальном хосте.

Я реализовал pub на C#:

            var options = new Options();
            var parser = new CommandLineParser(new CommandLineParserSettings(Console.Error));
            if (!parser.ParseArguments(args, options))
                Environment.Exit(1);

            using (var ctx = ZmqContext.Create())
            {
                using (var socket = ctx.CreateSocket(SocketType.PUB))
                {                   
                    foreach (var endPoint in options.bindEndPoints)
                        socket.Bind(endPoint);

                    long msgCptr = 0;
                    int msgIndex = 0;
                    while (true)
                    {
                        if (msgCptr == long.MaxValue)
                            msgCptr = 0;
                        msgCptr++;
                        if (options.maxMessage >= 0)
                            if (msgCptr > options.maxMessage)
                                break;                        
                        if (msgIndex == options.altMessages.Count())
                            msgIndex = 0;
                        var msg = options.altMessages[msgIndex++].Replace("#nb#", msgCptr.ToString("d2"));                        
                        Thread.Sleep(options.delay);
                        Console.WriteLine("Publishing: " + msg);
                        socket.Send(msg, Encoding.UTF8);
                    }
                }
            }

подпрограмма реализована на python:

def main():

    test_connect = "tcp://127.0.0.1:5000"
    test_topic = ""

    connect_to = test_connect
    topics = test_topic

    ctx = zmq.Context()
    s = ctx.socket(zmq.SUB)
    s.setsockopt(zmq.SUBSCRIBE, "")
    s.connect(connect_to)

    print "Receiving messages on All Topics ..."

    while True:
        print "try to receive"
        objA = s.recv()
        print objA

Сначала я запустил саб, а потом паб. Но сабвуфер не может получать сообщения от паба. Я не знаю почему.

Я тестировал pub в python, а sub в php и pub/sub в python. Оба они работали хорошо. Но когда оказалось, что pub или sub реализован на C#, возникли проблемы.

Как я могу решить эту проблему?

29.07.2014

  • Я исправил проблему сам. Ничего плохого в коде. Виновата именно версия ZMQ. Я упоминал clrzmq&libzmq(C#) в версии 3.0, но php-zmq в версии 2.2.0. Итак, связь не удалась. 30.07.2014
  • Если у кого-то возникла такая же проблема, как у меня, проверьте версию вашей библиотеки ZMQ. Хотя привязки ZMQ для разных языков действительно в беспорядке. 30.07.2014
  • :) рекомендуется использовать self.report() версию после запуска zmq.Context() 31.07.2014

Ответы:


1

Попробуйте упростить своего издателя, просто чтобы устранить неполадки. Я изменил следующее из первого PUB примера в Руководстве по ZMQ, найденному здесь:

using System;
using System.Text;
using ZeroMQ;

internal class Program
{
    public static void Main(string[] args)
    {
        using (var context = ZmqContext.Create())
        {
            using (ZmqSocket publisher = context.CreateSocket(SocketType.PUB))
            {
                // your first potential issue lies here, if you're not
                // populating your addresses properly then you're not going to
                // bind appropriately
                // Test by hard coding the address
                publisher.Bind("tcp://127.0.0.1:5000");

                int msgIndex = 0;

                while (true)
                {
                    // your second potential issue lies here, if your logic
                    // short circuits your send, that'll throw a wrench in the
                    // works
                    // Test by removing the logic and just sending a bunch of
                    // messages

                    var msg = "Message: " + msgIndex; // simplify
                    Console.WriteLine("Publishing: " + msg);
                    socket.Send(msg, Encoding.UTF8);
                    Thread.Sleep(500); // hard code
                    msgIndex++;
                    if (msgIndex > 1500) break; // hard code the break
                }
            }
        }
    }
}

... если это работает, то это проблема с вашей логикой. Просто создайте оттуда и посмотрите, в чем проблема. Если это не удается, то, вероятно, проблема связана с настройкой вашей системы или библиотекой ZMQ.

29.07.2014
  • Спасибо за ваш любезный ответ, но код, который вы предоставили, не работает. Я получаю библиотеку ZMQ с этого сайта codeproject.com/Articles/488207/ ZeroMQ-через-Csharp-Introduction. 30.07.2014
  • Проблема странная. Публикация/подписка могут обмениваться данными, если они оба написаны на C#. Но паб С# не может отправить сообщение на подпрограмму python и наоборот. 30.07.2014
  • Хорошо, это к чему-то нас привело... все это происходит на одном компьютере? т. е. c# pub и sub находятся на одном компьютере? паб С# находится на том же компьютере, что и сабвуфер python? Возможно, это просто общая проблема с сетевой связью, убедитесь, как минимум, что вы можете пинговать один компьютер с другого. 30.07.2014
  • @Jason - говорят, что и PUB, и SUB запускаются с петлевым портом локального хоста // 127.0.0.1:5000 (надеюсь, на одном и том же реальном хосте) 30.07.2014
  • Да, вы уже ответили на этот вопрос в своем первоначальном вопросе, извините за это, поэтому не должно быть никаких проблем, зависящих от сети... вы пробовали python или PHP pub, c# sub? сомневаюсь, что это будет по-другому, но может также исключить любую функциональность. 30.07.2014
  • @ user3666197 Спасибо за помощь. Я уже решил проблему сам. Это версия ZMQ для C# и php, которая вызвала ошибку. Первоначально я думал, что C# ZMQ (3.0) может хорошо работать с php ZMQ (2.2), но это действительно глупая мысль. Я искал и пробовал разные версии ZMQ для C# и, наконец, нашел ту, которая соответствовала версии php. 31.07.2014
  • @Jason Паб и саб работают на локальном хосте, на одном компьютере. Спасибо за вашу помощь, я понял, что это несоответствие версии ZMQ между C # и PHP. Я нашел подходящую версию для С#, которая могла взаимодействовать с версией php. Теперь все работает хорошо. 31.07.2014
  • рад, что вы поняли это, я ошибочно предположил, что оба языка будут обращаться к одной и той же библиотеке, но это имеет смысл. 31.07.2014

  • 2

    Попробуйте SUB-сторону в следующем порядке шагов

    ctx = zmq.Context()              // aGlobalCONTEXT
    s = ctx.socket(zmq.SUB)          // aSocketOBJECT
    s.connect(connect_to)            // aSocketOBJECT.connect() ...make PUB/SUB relation
    s.setsockopt(zmq.SUBSCRIBE, "")  // aSocketOBJECT.setsockopt() SUB to everything from this PUB
    

    Попробуйте на стороне PUB провести самодиагностику/распечатать в интерфейсе командной строки результат каждой попытки .Bind() (распечатать как endPoint, так и возвращаемое значение (код подтверждения) из вызова socket.Bind())

    29.07.2014
  • Я пробовал все ваши советы, но, кажется, все еще что-то не так. Во-первых, я переключил 2 строки. Ничего другого не произошло. Затем я попытался напечатать возвращаемое значение socket.Bind(), но это недействительная функция. 30.07.2014
  • @sakonque, какие значения ‹endPoint› вы предоставляете процессу на стороне PUB из командной строки? 30.07.2014
  • Новые материалы

    Прогресс в технологии Трансформеров часть 3
    Многомасштабный управляющий сигнальный преобразователь для бесфазного синтеза движения (arXiv) Автор: Линтао Ван , Кун Ху , Лей Бай , Юй Дин , Ваньли Оуян , Чжиюн Ван . Аннотация:..

    Представляем поддержку компонентов Vue.js. Мгновенный HMR и многое другое.
    Хотя у FuseBox уже был плагин Vue, он был базовым и не имел многих функций, которые делали работу с Vue.js такой приятной. Однако с этим выпуском мы рады сообщить, что в FuseBox..

    Приключения в Javascript, часть 1
    Я продолжаю думать о том, чтобы писать больше, но чем больше я думаю об этом, тем меньше я это делаю. Итак, сегодня я перестал думать и начал писать. Отсюда можно только спускаться… В..

    Понимание дженериков в TypeScript: подробное руководство
    Введение TypeScript, строго типизированный надмножество JavaScript, хорошо известен своей способностью улучшать масштабируемость, удобочитаемость и ремонтопригодность приложений. Одной из..

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..