os/net/ ZeroMQ


ZeroMQ is a framework for writing distribute applications. Homepage

Official minimal example

Server:

#
#   Hello World server in Python
#   Binds REP socket to tcp://*:5555
#   Expects b"Hello" from client, replies with b"World"
#

import time
import zmq

context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")

while True:
    #  Wait for next request from client
    message = socket.recv()
    print("Received request: %s" % message)

    #  Do some 'work'
    time.sleep(1)

    #  Send reply back to client
    socket.send(b"World")

client:

Copy
#
#   Hello World client in Python
#   Connects REQ socket to tcp://localhost:5555
#   Sends "Hello" to server, expects "World" back
#

import zmq

context = zmq.Context()

#  Socket to talk to server
print("Connecting to hello world server…")
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555")

#  Do 10 requests, waiting each time for a response
for request in range(10):
    print("Sending request %s …" % request)
    socket.send(b"Hello")

    #  Get the reply.
    message = socket.recv()
    print("Received reply %s [ %s ]" % (request, message))

RtMidi Pipe

Example that takes midi from a device (here an M32), and forwards the raw midi messages via ZeroMQ.

Server

import time
import zmq

context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")

while True:
    #  Wait for next request from client
    message = socket.recv()
    print("Received request: ",end="")
    for i,x in enumerate(message):
      print(f"{x:02x}",end=" ")
      if (i+1)%32 == 0:
        print()
    if (i+1)%32 != 0:
      print()

    #  Send reply back to client
    socket.send(b"ACK")

Client

import zmq
from time import sleep
from rtmidi import RtMidiIn

context = zmq.Context()

#  Socket to talk to server
print("Connecting to hello world server…")
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555")

pat = "M32"
midiin = RtMidiIn()
for i in range(midiin.getPortCount()):
  name = midiin.getPortName(i)
  if pat in name:
    midiin.openPort(i)
    break
else:
  print(f"Didn't find port with name containing {pat}")
  exit(1)


def cb(e):
  a = e.getRawData()
  print(a)
  socket.send(a)
  message = socket.recv()
  print(f"received {message}")
midiin.setCallback(cb)
try:
  while True:
    sleep(0.01)
except KeyboardInterrupt:
  exit(0)