Heh, I was writing some networking stuff yesterday too.  Small world.

I'd make one change.  Add (:use clojure.contrib.duck-streams) to your
namespace definition.  Then you can change handle-client to this

(defn handle-client [_ client]
  (spit (.getOutputStream client) message)
  (doto client
    .shutdownInput
    .shutdownOutput
    .close))

Take a look at duck streams, it will be really handy any time you do
something like this.

Hope that helps,
Sean

On Nov 13, 2:35 am, Ross Thomas <halfacan...@gmail.com> wrote:
> Hello group,
>
> First I'd like to thank Rich for such a great new tool. The assertion
> in Programming Clojure that it "feels like a general-purpose language
> beamed back from the near future" really sums things up very nicely.
> Homoiconicity + FP + STM + JVM = epic win.
>
> Anyway, thought I'd say hi, and solicit opinions on my first "non-
> trivial" (that's a relative term ;)) Clojure program, a toy server
> which opens a listening socket and prints a message to each connecting
> client:
>
> ;;;
>
> (ns seq-server
>   #^{:author "Ross Thomas <halfacan...@gmail.com>"}
>   (:import (java.net ServerSocket)))
>
> (def listen-port 8555)
> (def num-agents 32)
> (def message "Hello, world!\r\n")
>
> (def server-sock (ServerSocket. listen-port))
>
> (def clients (repeatedly #(.accept server-sock)))
>
> (def agent-pool (take num-agents (repeatedly #(agent nil))))
>
> (def agents (cycle agent-pool))
>
> (def work-seq (map vector clients agents))
>
> (declare handle-client)
>
> (defn run []
>   (doseq [[c a] work-seq]
>     (send-off a handle-client c)))
>
> (defn handle-client [_ client]
>   (.. client getOutputStream (write (.getBytes message)))
>   (doto client
>     .shutdownInput
>     .shutdownOutput
>     .close))
>
> (run)
>
> ;;;
>
> I can't decide if doing it that way is a bit too weird or not, but it
> was fun to write. Anyway, interested to hear comments/criticisms, how
> I could make it more idiomatic, etc. :)
>
> -Ross

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to