Created
July 12, 2009 00:18
-
-
Save NicolasT/145449 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; 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