Skip to content

Instantly share code, notes, and snippets.

@NicolasT
Created July 12, 2009 00:18
Show Gist options
  • Save NicolasT/145449 to your computer and use it in GitHub Desktop.
Save NicolasT/145449 to your computer and use it in GitHub Desktop.
; Some imports we need
(import '(java.net ServerSocket Socket SocketException)
'(java.io InputStreamReader BufferedReader OutputStreamWriter)
)
; Helper to run a callable in a new thread
(defn threaded [fun]
; Create a new thread
(let [thread (new Thread fun)]
; And start it
(. thread (start))
)
)
; Accept function: whenever a new connection is made to the listening socket,
; this function spawns of a new thread running the connection handler function,
; providing the input- and output-stream
(defn accept-fun [service-fun sock]
(threaded
#(service-fun (. sock (getInputStream)) (. sock (getOutputStream)))
)
)
; Run a service on a given port
; The given service-fun should accept 2 arguments: the input and output channel
; of the connection it should handle
(defn run-service [service-fun port]
; Create the listening socket
(let [server (new ServerSocket port)]
; And run the following in a thread...
(threaded
; If our socket is not closed
#(when-not (. server (isClosed))
; Accept incoming connection(s)
(try
; And run our accept helper given the new connection socket
(accept-fun service-fun (. server (accept)))
; Unless accept fails: we don't really care for now
(catch SocketException e)
)
; And keep on going
(recur)
)
)
)
)
; Our service function, takes 2 arguments
(defn echo [sin sout]
; Create a BufferedReader from the input socket
(let [rin (new BufferedReader (new InputStreamReader sin))]
; Set up a loop, reading one line from the input socket
(loop [line (. rin (readLine))]
; Dump it to the console
(println line)
; And send it back on the socket (adding a newline)
(. sout (write (. (str line "\n") getBytes)))
; Now read out the next line and go back to the start of this loop
(recur (. rin (readLine)))
)
)
)
; Set up our server
(def server (run-service echo 8000))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment