Дарт и ZeroMQ сервер - PullRequest
       8

Дарт и ZeroMQ сервер

0 голосов
/ 23 июня 2018

Это вопрос новичка. У меня есть очень простой сервер ZeroMQ, написанный на Python. В основном это удаленный вызов процедуры, строка в, строка вне.

import sys
import time
import zmq
import mutagen
import json

port = "64107"

context = zmq.Context()
responder = context.socket(zmq.REP)
try:
    responder.bind(f"tcp://*:{port}")
except:
    sys.exit(0)

print(f'running on port {port}')

try:

    while True:
        #  Wait for next request from client
        message = responder.recv()
        jsn = message.decode('utf8')
        rq = json.loads(jsn)

        reply = '{"reply": "unknown"}'

        if rq['request'] == 'settags':
            audio = mutagen.File(rq['file'], easy=True)
            if audio:
                reply = '{{"reply": "settags", "file": "{}", "tags": {{"tracknumber": "{}"}}}}'
                reply = reply.format(rq['file'], rq['tags']['tracknumber'])
                for tag, value in rq['tags'].items():
                    audio[tag] = value
                audio.save()
        elif rq['request'] == 'serve':
            reply = '{"reply": "serve"}'

        #  Send reply back to client
        responder.send_string(reply)

except KeyboardInterrupt as e:
    sys.exit(e)

Я бы хотел получить доступ к этому серверу из приложения Dart. Насколько мне известно, нет пакета ZeroMQ для Dart. Нужно ли использовать модуль JS zmq? Обязательно ли использовать ZeroMQ на стороне клиента? Может быть, можно использовать Dart native io для связи с этим сервером?

Извините, если вопрос глупый.

Ответы [ 2 ]

0 голосов
/ 22 июня 2019

Я бы порекомендовал решить эту проблему, написав небольшой адаптер ZeroMQ <-> WebSocket на python с использованием торнадо, а затем использовать WebSockets из клиента Dart. WebSockets изначально поддерживаются в Dart, а их парадигма, основанная на сообщениях, совместима с ZeroMQ.

0 голосов
/ 24 июня 2018

Обязательно ли использовать ZeroMQ и на стороне клиента?

Что ж, в случае, если вы предпочитаете оставаться на основе удобства интеллектуальных абстракций ZeroMQ, используя REQ/REP масштабируемый шаблон архивных форм формального обмена, ответ будет положительным, если вы не справитесь для реализации REQ/REP -поведения, который будет полностью имитировать == соответствовать всем требованиям спецификации ZMTP-RFC по шаблону архетипа. Таким образом, его можно реализовать на основе «зеленого поля», без повторного использования каких-либо уже доступных привязок / оболочек языка библиотеки ZeroMQ.

выполнимо , но звучит для меня как последнее средство.


Существует также другой доступный доступный.

ZeroMQ может быть настроен на использование архетипа «сырого» сокета. Таким образом вы теряете все удобство абстракций интеллектуальных сигналов и обмена сообщениями ZeroMQ, но вы можете настроить сторону ZeroMQ для «разговора» по соединениям, которые проходят через «необработанные» - ( dumb ) - сокеты.


import sys
import time
import zmq
import mutagen
import json

PORT     = "64107"
TEMPLATE = ( '{{"reply":' + '"settags",'
           +   '"file":'  + '"{0:}",'                   # <-{0:} <- aFile
           +   '"tags":'  + '{{"tracknumber": "{1:}"}}' # <-{1:} <- aTrackNo
           +  '}}'
              )

pass;       context       = zmq.Context()
responder = context.socket( zmq.REP )
responder.setsockopt(       zmq.LINGER, 0 )

try:
    responder.bind( f"tcp://*:{PORT}" )
except:
    print( "EXC:: ZeroMQ-{0:} Error[{1:}]".format( zmq.pyzmq_version(),
                                                   zmq.ZMQError()
                                                   )
            )
    # --------------------------------------------------------------ALWAYS
    responder.close()
    context.term()
    # --------------------------------------------------------------ALWAYS
    sys.exit(0)                                   # EXIT --> --> -->

print( f'running on port {PORT}' )

try:
    while True:
        message = responder.recv()    # BLOCKS till next request from client
        rq = json.loads( message.decode( 'utf8' ) )

        if rq['request'] == 'settags':
            audio = mutagen.File( rq['file'], easy=True )
            if audio:
                for tag, value in rq['tags'].items():
                    audio[tag] = value
                audio.save()

                #esponder.send_json(   ...     ) # native .send_json() method
                responder.send_string( TEMPLATE.format( rq['file'],
                                                        rq['tags']['tracknumber']
                                                        )
                                       )
                continue                         # LOOP --^ --^ --^
            else:
                responder.send_string( '{"reply": "unknown"}' )
                continue                         # LOOP --^ --^ --^
        elif rq['request'] == 'serve':
                responder.send_string( '{"reply": "serve"}' )
                continue                         # LOOP --^ --^ --^

except KeyboardInterrupt as e:
    # --------------------------------------------------------------ALWAYS
    responder.close()
    context.term()
    # --------------------------------------------------------------ALWAYS
    sys.exit(e)                                  # EXIT --> --> -->
...