2009-08-03 19 views
22

Me gustaría escribir un servidor de multiplexación simple en Clojure (como un proyecto de muestra para aprender el idioma) pero estoy teniendo dificultades para encontrar recursos que me ayuden en esto en la web.escribiendo un servidor de multiplexación en clojure?

¿Alguien tiene algún recurso que pueda señalar lo básico de la programación de socket en Clojure y la mejor manera de escribir un servidor como este?

Respuesta

31

clojure.contrib.server-socket es tu amigo. Utilice create-server al igual que para crear un simple servidor de 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)) 

Ahora telnet para asegurarse de que funciona:

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

Por cierto, el servidor es multiproceso también, porque clojure.contrib.server-socket crea un nuevo hilo en aceptando una nueva conexión.

Si eso no satisface sus necesidades, entonces la API de Java es su amiga. Como tiene acceso completo a las clases de Java de Clojure, puede usar los sockets de Java si necesita acceder al metal. No sé nada sobre sus antecedentes, pero suponiendo que no haya utilizado zócalos Java antes, Sun tiene un tutorial: http://java.sun.com/docs/books/tutorial/networking/sockets/

+1

¡hermoso! gracias :) – horseyguy

+0

¡Gracias! Aquí he creado un proyecto de leiningen simple con su código: https://github.com/cymen/clojure-socket-echo – Cymen

+2

Server-socket ahora vive en clojars después de la ruptura de clojure.contrib. https://clojars.org/server-socket es el lugar para ir a Clojure> 1.2. –

1

Consulte clojure.contrib para ver si hay bibliotecas para manipular conectores. Si no hay, entonces te queda la posibilidad de escribir el tuyo usando clases Java a través de las instalaciones de interoperabilidad Java de Clojure.

10

Escribí un pequeño juego de aventuras de texto para varios jugadores llamado Mire que demuestra esto. Es bastante sencillo.

0

Escribí una biblioteca llamada clj-sockets que lo hace bastante fácil. Desde el 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 

También le puede ayudar connect to remote hosts. Y está annotated source code si quieres echar un vistazo debajo del capó. ¡Buena suerte!