2009-08-03 11 views
22

Chciałbym napisać prosty serwer multipleksujący w Clojure (jako przykładowy projekt do nauki języka), ale bardzo trudno jest znaleźć zasoby, które mogłyby mi w tym pomóc w Internecie.pisanie serwera multipleksującego w clojure?

czy ktoś ma jakieś zasoby, które mogą wskazywać na podstawy programowania gniazd w Clojure i jak najlepiej napisać taki serwer?

Odpowiedz

31

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/

+1

piękne! dzięki :) – horseyguy

+0

Dziękujemy! Stworzyłem prosty projekt związany z tym projektem z twoim kodem: https://github.com/cymen/clojure-socket-echo – Cymen

+2

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. –

1

Sprawdź, czy istnieją jakieś biblioteki do manipulowania gniazdami. Jeśli tak nie jest, możesz napisać własne, używając klas Java poprzez Clojure's Java interop facilities.

10

Napisałem małą grę przygodową tekstową dla wielu graczy o nazwie Mire, która to demonstruje. To całkiem proste.

0

Napisałem bibliotekę o nazwie clj-sockets, która czyni ją całkiem łatwą. Od README:

(def server (listen (create-server 9871))) 
; blocks until a connection is made 
; in this case I'm doing "telnet localhost 9871" from the shell 
=> #'clj-sockets.core/server 

server 
=> #<Socket Socket[addr=/0:0:0:0:0:0:0:1%0,port=57437,localport=9871]> 

(read-line server) 
; blocks until a line is sent (in this case through telnet) 
=> "hello from telnet" 

(write-line server "hello there, person using telnet!") 
=> nil 

(close server) 
=> nil 

Może ona również pomóc Ci connect to remote hosts. I jest annotated source code, jeśli chcesz mieć podgląd pod maską. Powodzenia!