Skip to content

Instantly share code, notes, and snippets.

@jpoler
Created February 2, 2015 02:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jpoler/1899f300c26c203c9ef4 to your computer and use it in GitHub Desktop.
Save jpoler/1899f300c26c203c9ef4 to your computer and use it in GitHub Desktop.
Simple echo server in Clojure!
(ns clojechosrv.core
(:import (java.io File FileInputStream InputStreamReader BufferedReader
BufferedWriter OutputStreamWriter FileOutputStream)
(java.net ServerSocket)))
(require '[clojure.string :as str])
(defn sock-write [writer msg]
(let [line (str msg "\r\n")]
(. writer write line 0 (count line))))
(defn sock-read [reader]
(. reader readLine))
(defn echo [in out]
(loop []
(let [msg (sock-read in)]
(when (not (empty? msg))
(sock-write out msg)
(.flush out)
(recur)))))
(defn server [port action]
(let [sock (ServerSocket. port)]
(loop []
(let [client-socket (. sock accept)
in (BufferedReader. (InputStreamReader. (.getInputStream client-socket)))
out (BufferedWriter. (OutputStreamWriter. (.getOutputStream client-socket)))]
(action in out)
(.close client-socket)
(recur)))))
(defn -main [port]
(server (Integer. port) echo))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment