Dart 和 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:
    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 native io 与该服务器进行通信?

对不起,如果这个问题很愚蠢。

最佳答案

Is it mandatory to use ZeroMQ on the client side too ?



好吧,以防万一,您更愿意继续使用 ZeroMQ 智能抽象的舒适性,使用 REQ/REP 可扩展的正式通信原型(prototype)模式,答案是肯定的,除非你设法实现 REQ/REP -行为,这将完全模仿 == 满足所有原型(prototype)模式 ZMTP-RFC 规范的要求。因此,可以在绿地的基础上实现它,而无需重新使用任何已经可用的 ZeroMQ 库语言绑定(bind)/包装器。

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

还有另一种方法可用的。

ZeroMQ 可以设置为使用“原始”套接字原型(prototype)。这样一来,您就失去了 ZeroMQ 智能信令和消息传递抽象的所有舒适性,但您可以设置 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 --> --> -->

关于Dart 和 ZeroMQ 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51004156/

相关文章:

.net - EntLib 缓存应用程序 block 的替代方案?

c++ - ZMQ 在 Publisher Socket 上产生 EAGAIN

python - ZeroMQ收不到消息怎么办?

Flutter如何通过id链接数组

flutter - 为什么Flutter PageView在setState后重置为第0页

dart - Flutter 如何发布 json 数组

c++ - 处理 TCP 流

python - Python 桌面应用程序的数据库权限

sockets - ZMQ套接字-满足所有请求时断开连接

dart Recipe file.rename() 重命名文件但不更新对象中的路径