2009-08-03 15 views
22

Mi piacerebbe scrivere un semplice server multiplexing in Clojure (come progetto di esempio per imparare la lingua) ma sto facendo fatica a trovare risorse per aiutarmi in questo sul web.scrivendo un server multiplexing in clojure?

qualcuno ha risorse che possono puntare alle nozioni di base sulla programmazione dei socket in Clojure e il modo migliore per scrivere un server di questo tipo?

risposta

31

clojure.contrib.server-socket è tuo amico. Utilizzare create-server in questo modo per creare un semplice server di eco:

(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)) 

Ora telnet per assicurarsi che funzioni:

$ telnet localhost 8080 
Trying 127.0.0.1... 
Connected to localhost. 
Escape character is '^]'. 
hello 
hello // this is the echoed line, woohoo! 

Tra l'altro, il server è multithreaded anche, perché clojure.contrib.server-socket crea un nuovo thread su accettare una nuova connessione.

Se ciò non soddisfa le tue esigenze, l'API Java è tua amica. Dal momento che hai pieno accesso alle classi Java da Clojure, puoi semplicemente usare i socket Java se devi scendere al metal. Non so nulla del tuo background, ma supponendo che tu non abbia usato i socket Java, Sun ha un tutorial: http://java.sun.com/docs/books/tutorial/networking/sockets/

+1

bellissimo! grazie :) – horseyguy

+0

Grazie! Ho creato un semplice progetto leiningen per questo qui con il tuo codice: https://github.com/cymen/clojure-socket-echo – Cymen

+2

Server-socket ora vive in clojars dopo la rottura di clojure.contrib. https://clojars.org/server-socket è il posto dove andare per Clojure> 1.2. –

1

Verificare clojure.contrib per vedere se ci sono eventuali librerie per la manipolazione di socket. Se non ci sono, allora sei lasciato a scrivere il tuo usando le classi Java attraverso le strutture di interoperabilità Java di Clojure.

10

Ho scritto un piccolo gioco di avventura di testo multiplayer chiamato Mire che lo dimostra. È piuttosto semplice.

0

Ho scritto una libreria chiamata clj-sockets che lo rende piuttosto facile. Dal 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 

Può anche aiutare a connect to remote hosts. E c'è lo annotated source code se vuoi avere una sbirciatina sotto il cofano. In bocca al lupo!