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)
だけで良さそうだ。