писать сервер мультиплексирования в clojure? - PullRequest
22 голосов
/ 03 августа 2009

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

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

Ответы [ 4 ]

31 голосов
/ 03 августа 2009

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 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/

10 голосов
/ 13 августа 2009

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

1 голос
/ 03 августа 2009

Проверьте clojure.contrib, чтобы увидеть, есть ли какие-либо библиотеки для работы с сокетами. Если нет, то вы можете писать свои собственные, используя классы Java с помощью средств взаимодействия Java Clojure.

0 голосов
/ 24 января 2015

Я написал библиотеку под названием 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...