clojure.contrib.server-socket
jest twoim przyjacielem. Użyj create-server
jak tak, aby stworzyć prosty serwer echo:
(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))
Teraz telnet, aby upewnić się, że działa:
$ telnet localhost 8080
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
hello
hello // this is the echoed line, woohoo!
Nawiasem mówiąc, serwer jest wielowątkowe też, bo clojure.contrib.server-socket
tworzy nowy wątek na zaakceptowanie nowego połączenia.
Jeśli to nie spełnia Twoich wymagań, to Java API jest twoim przyjacielem. Ponieważ masz pełny dostęp do klas Java z Clojure, możesz po prostu użyć gniazd Javy, jeśli chcesz dostać się do metalu. Nie wiem nic o twoim pochodzeniu, ale zakładając, że wcześniej nie korzystałeś z Java, Sun ma samouczek: http://java.sun.com/docs/books/tutorial/networking/sockets/
piękne! dzięki :) – horseyguy
Dziękujemy! Stworzyłem prosty projekt związany z tym projektem z twoim kodem: https://github.com/cymen/clojure-socket-echo – Cymen
Server-socket teraz żyje w clojars po rozpadzie clojure.contrib. https://clojars.org/server-socket to miejsce, w którym można przejść do Clojure> 1.2. –