Подтвердить что ты не робот

Запись сервера мультиплексирования в clojure?

Я хотел бы написать простой сервер мультиплексирования в Clojure (в качестве примера для изучения языка), но мне очень трудно найти ресурсы, которые помогут мне в этом в Интернете.

Есть ли у кого-нибудь ресурсы, которые могут указывать на основы программирования сокетов в Clojure и лучший способ написать такой сервер?

4b9b3361

Ответ 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/

Ответ 2

Я написал небольшую многопользовательскую текстовую приключенческую игру под названием Mire, которая демонстрирует это. Это довольно просто.

Ответ 3

Отметьте clojure.contrib, чтобы узнать, есть ли библиотеки для управления сокетами. Если этого не произошло, вы остаетесь писать свои собственные, используя классы Java через Clojure средства взаимодействия Java.

Ответ 4

Я написал библиотеку под названием clj-sockets, что делает ее довольно простой. Из 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

Он также может помочь вам подключиться к удаленным хостам. И аннотированный исходный код, если вы хотите заглянуть под капот. Удачи!