Dart和ZeroMQ服务器
这是个新手问题。我有一个非常简单的ZeroMQ服务器,用Python编写。它基本上是一个远程过程调用,输入字符串,输出字符串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
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 --> --> -->