Skip to content

Instantly share code, notes, and snippets.

@opqdonut
Last active February 1, 2024 06:58
Show Gist options
  • Save opqdonut/fb01122e13aa2153a65ac45748368f07 to your computer and use it in GitHub Desktop.
Save opqdonut/fb01122e13aa2153a65ac45748368f07 to your computer and use it in GitHub Desktop.
Python-Clojure communication with msgpack-over-udp

Python-Clojure communication with msgpack-over-udp

Install deps & start the python broadcast:

python -m venv venv
. ./venv/bin/activate
pip install -r requirements.txt
python broadcast.py

Start the clojure listener:

clj -M -m receive
import msgpack
import socket
from time import sleep
ADDR="127.255.255.255"
PORT=13337
counter=0
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
while True:
data = {"xyz": [1.1, 2.2, 3.3], "enabled": True, "counter": counter}
counter = counter + 1
payload = msgpack.packb(data)
print("send", data)
sock.sendto(payload, (ADDR, PORT))
sleep(1)
{:paths ["."]
:deps {clojure-msgpack/clojure-msgpack {:mvn/version "1.2.1"}}}
(ns receive
(:require [msgpack.core :as msgpack])
(:import [java.net DatagramPacket DatagramSocket InetSocketAddress StandardSocketOptions]))
(def read-port 13337)
(def max-len 1500)
(defn -main []
(let [sock (doto (DatagramSocket. nil)
(.setBroadcast true)
(.setReuseAddress true)
(.setOption StandardSocketOptions/SO_REUSEPORT true)
(.setSoTimeout 10000)
(.bind (InetSocketAddress. read-port)))
packet (DatagramPacket. (byte-array max-len) max-len)]
(while true
(.receive sock packet)
(let [data (msgpack/unpack (.getData packet))]
(prn :received data)))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment