Skip to content

Instantly share code, notes, and snippets.

@ordnungswidrig
Created August 5, 2011 13:03
Show Gist options
  • Save ordnungswidrig/1127497 to your computer and use it in GitHub Desktop.
Save ordnungswidrig/1127497 to your computer and use it in GitHub Desktop.
Simple clojure rpc server using read and pr to serialize messages
(def s (start-server 3000 inc false))
;; echo 10\n20\n30 | nc localhost 3000
;; => 11\n21\n31
(stop-server s)
(ns server
(:require [clojure.contrib.server-socket :as server])
(:require [clojure.stacktrace :as stack])
(:import [java.net ServerSocket SocketException]
[java.io InputStreamReader PushbackReader BufferedReader PrintWriter OutputStreamWriter]))
(defn handle-client [handler-fn print-dup in out]
(try
(let [in (-> in
(InputStreamReader.)
(BufferedReader.)
(PushbackReader.))
out (-> out
(OutputStreamWriter.)
(PrintWriter.))]
(loop []
(let [eof (Object.)
msg (read in false eof)]
(when-not (identical? msg eof)
(let [answer (try {:result (handler-fn msg)}
(catch Exception e {:exception (str e)
:stacktrace (with-out-str (stack/print-cause-trace e))}))]
(binding [*print-dup* print-dup
*out* out]
(prn answer))
(.flush out)
(recur))))))
(catch Exception e
(prn "Exception in client")
(.printStackTrace e))))
(defn make-handler [handler-fn print-dup]
(partial handle-client handler-fn print-dup))
(defn start-server [port handler-fn print-dup]
(server/create-server port (make-handler handler-fn print-dup)))
(defn stop-server [server]
(server/close-server server))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment