Обязательно ли использовать 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 --> --> -->