Dart和ZeroMQ服务器

Dart和ZeroMQ服务器,dart,client,zeromq,Dart,Client,Zeromq,这是个新手问题。我有一个非常简单的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

这是个新手问题。我有一个非常简单的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应用程序访问此服务器。据我所知,Dart没有ZeroMQ包。我必须使用JS zmq模块吗?在客户端也必须使用ZeroMQ吗?也许可以使用Dart本机io与此服务器通信

对不起,如果这个问题很傻的话

在客户端也必须使用ZeroMQ吗?

好的,如果您更愿意基于ZeroMQ智能抽象的舒适性,使用可伸缩的正式通信原型模式,答案将是肯定的,除非您设法实现
REQ/REP
-行为,这将完全模仿==满足所有原型模式ZMTP RFC规范的要求。因此,可以在绿色字段的基础上实现它,而无需重新使用任何已经可用的ZeroMQ库语言绑定/包装器

可行,但在我看来,这是一种最后的手段


还有另一种方法可用

ZeroMQ可以设置为使用“原始”套接字原型。这样一来,您就失去了ZeroMQ智能信令和消息传递抽象的所有舒适性,但您可能会将ZeroMQ端设置为在“原始”(哑)套接字上运行的连接上“说话”


导入系统 导入时间 导入zmq 进口诱变剂 导入json 端口=“64107” 模板=(“{”回复“+”“设置标签“,” +““文件”:“+”{0:}“,”#-->-->
我建议通过使用tornado在python中编写一个小型ZeroMQWebSocket适配器来解决这个问题,然后从Dart客户端使用WebSocket。WebSocket在Dart中本机支持,其基于消息的范例与ZeroMQ兼容

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