这是一个新手问题。我有一个非常简单的 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/