title: Simple OSC Send and Receive tags: python osc net ## Examples BobbinsServer ### From the Docs Client ```py """Small example OSC client This program sends 10 random values between 0.0 and 1.0 to the /filter address, waiting for 1 seconds between each value. """ import argparse import random import time from pythonosc import udp_client if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--ip", default="127.0.0.1", help="The ip of the OSC server") parser.add_argument("--port", type=int, default=5005, help="The port the OSC server is listening on") args = parser.parse_args() client = udp_client.SimpleUDPClient(args.ip, args.port) for x in range(10): client.send_message("/filter", random.random()) time.sleep(1) ``` Server ```py """Small example OSC server This program listens to several addresses, and prints some information about received packets. """ import argparse import math from pythonosc.dispatcher import Dispatcher from pythonosc import osc_server def print_volume_handler(unused_addr, args, volume): print("[{0}] ~ {1}".format(args[0], volume)) def print_compute_handler(unused_addr, args, volume): try: print("[{0}] ~ {1}".format(args[0], args[1](volume))) except ValueError: pass if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--ip", default="127.0.0.1", help="The ip to listen on") parser.add_argument("--port", type=int, default=5005, help="The port to listen on") args = parser.parse_args() dispatcher = Dispatcher() dispatcher.map("/filter", print) dispatcher.map("/volume", print_volume_handler, "Volume") dispatcher.map("/logvolume", print_compute_handler, "Log volume", math.log) server = osc_server.ThreadingOSCUDPServer( (args.ip, args.port), dispatcher) print("Serving on {}".format(server.server_address)) server.serve_forever() ``` ## Other Examples Another trivial sender (give messages as command line args) ```py #!/usr/bin/env python3 import re import os import sys import argparse import socket from pythonosc import udp_client default_port = 5005 host = os.getenv("PHOST",os.getenv("HOST","localhost")) port = os.getenv("PPORT",os.getenv("PORT",default_port)) try: port = int(port) except ValueError: print(f"Invalid PORT variable, defaulting to {default_port}") port = default_port def parse_arg(x): for t in [int,float]: try: return t(x) except ValueError: pass return x if __name__ == "__main__": parser = argparse.ArgumentParser(add_help=False) parser.add_argument("-h","--ip", default=host, help="The ip of the OSC server") parser.add_argument("-p","--port", type=int, default=port, help="The port the OSC server is listening on") parser.add_argument("--help", action="help", help="show this help message and exit") args, other = parser.parse_known_args() # we need only send empty messages client = udp_client.SimpleUDPClient(args.ip, args.port, family=socket.AF_INET) for x in other: xs = re.split(r"\s+",x.strip()) addr = "/"+xs[0] ys = [parse_arg(y) for y in xs[1:]] print(f"Sending {addr} {ys} to {args.ip}:{args.port}") client.send_message(f"/{addr}", ys) ``` and a receiver ```py #!/usr/bin/env python3 import os from subprocess import run from pythonosc.dispatcher import Dispatcher from pythonosc import osc_server import argparse def handle_osc(*xs,**kw): cmd = xs[0][1:] args = xs[1:] print(f"Got {cmd=} {args=} {kw=}") def main(): parser = argparse.ArgumentParser(add_help=False) parser.add_argument("-h","--ip", default="0.0.0.0", help="The ip to listen on") parser.add_argument("-p","--port", type=int, default=5005, help="The port to listen on") parser.add_argument("--help",action="help",help="show this help") args, other = parser.parse_known_args() dispatcher = Dispatcher() dispatcher.set_default_handler(handle_osc) server = osc_server.ThreadingOSCUDPServer( (args.ip, args.port), dispatcher) print("Serving on {}".format(server.server_address)) server.serve_forever() if __name__ == "__main__": main() ```