Ответ 1
clojure.contrib.server-socket
- ваш друг. Используйте create-server
, чтобы создать простой сервер эха:
(import '[java.io BufferedReader InputStreamReader OutputStreamWriter])
(use 'clojure.contrib.server-socket)
(defn echo-server []
(letfn [(echo [in out]
(binding [*in* (BufferedReader. (InputStreamReader. in))
*out* (OutputStreamWriter. out)]
(loop []
(let [input (read-line)]
(print input)
(flush))
(recur))))]
(create-server 8080 echo)))
(def my-server (echo-server))
Теперь telnet, чтобы убедиться, что он работает:
$ telnet localhost 8080
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
hello
hello // this is the echoed line, woohoo!
Кстати, сервер тоже многопоточен, потому что clojure.contrib.server-socket
создает новый поток при приеме нового соединения.
Если это не соответствует вашим потребностям, то Java API - ваш друг. Поскольку у вас есть полный доступ к Java-классам из Clojure, вы можете просто использовать Java-сокеты, если вам нужно перейти к металу. Я ничего не знаю о вашем прошлом, но, предполагая, что вы раньше не использовали Java-сокеты, у Sun есть учебник: http://java.sun.com/docs/books/tutorial/networking/sockets/