Echo server

Programming Clojureを読んだ直後にも書いたが、またEcho serverを書いてみた。以前に作成したのは冗長だった。
clojure.contrib.server-socketとclojure.contrib.duck-streams/copyを使うと簡単だ。

(ns socket-test
  (:use [clojure.contrib.server-socket :only (create-server close-server)]
	[clojure.contrib.duck-streams :only (copy)]))

(def *server* (atom nil))

(def *port* 10000)

(defn echo-fn [in out]
  (println "echo start")
  (copy in out)
  (println "echo end"))

(defn start-server []
  (reset! *server*
	  (create-server *port* echo-fn)))

(defn stop-server []
  (when-not (nil? @*server*)
    (close-server @*server*)
    (reset! *server* nil)))

Echo serverを実行する。

user> (in-ns 'socket-test)
#<Namespace socket-test>
socket-test> (start-server)
{:server-socket #<ServerSocket ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=10000]>,
 :connections #<Ref@1c1eceb: #{}>}

telnetしてみる。

satoshi@tpx61 /cygdrive/c/home
$ telnet localhost 10000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
hoge ←◆入力
hoge ←◆返ってきた
fuga ←◆入力
fuga ←◆返ってきた

telnet> Connection closed.

satoshi@tpx61 /cygdrive/c/home
$ 

動いた。\(^▽^)/

Echo serverを終了する。

socket-test> (stop-server)
nil

printlnが不要なら、start-server関数のcreate-server部分は

(create-server *port* copy)

だけで良さそうだ。