Ответ 1
aleph поддерживает веб-порты как на сервере, так и на клиенте. Это может занять некоторое время, чтобы привыкнуть к асинхронному стилю и аберрациям алеф-ядра, но это очень хороший инструмент, как только вы получите его.
Я установил сервер WebSocket, используя http-kit, который должен принимать соединения веб-сокетов. Это основной пример, показанный в документации http-kit.
Вопрос: Как создать клиент Clojure, который подключается к нему?
Клиент может быть любой Clojure http-библиотекой, на самом деле я не против. Я уже знаю о клиентах Javascript, и я считаю, что Java имеет API, который я мог бы использовать из Clojure. Но я ищу библиотеку Clojure, которая поддерживает websockets и для сервера и. Я ничего не видел в http-kit-коде, который облегчил бы его.
aleph поддерживает веб-порты как на сервере, так и на клиенте. Это может занять некоторое время, чтобы привыкнуть к асинхронному стилю и аберрациям алеф-ядра, но это очень хороший инструмент, как только вы получите его.
Клиент http-kit еще не поддерживает WebSocket (я не могу придумать для него хороший API). Алеф - хороший вариант для такого использования. Другим вариантом является http.async.client, я использовал его в веб-узле http-kit websocket unit test: здесь
Согласно этому объявлению, http-kit поддерживает веб-сокеты. Если вы не привязаны к асинхронным средствам, предлагаемым клиентом http-kit, вы также можете использовать clj-http. У них очень похожий интерфейс, кажется (у меня есть использование, но clj-http пока).
(ns playground.experiments.ws
(:use aleph.http lamina.core))
(defn ws-client [] (websocket-client {:url "ws://echo.websocket.org:80"}))
(defn echo [message]
(let [channel (wait-for-result (ws-client) 500)]
(enqueue channel message)
(let [echo (wait-for-result (read-channel channel) 500)]
(close channel)
echo)))
(echo "Echo me!")
Gniazdo является клиентом WebSocket для Clojure. Он завершает реализацию протокола Jetty.
Для тех, кто присоединился к нам в 2015 году: я был новичком в этом, я просто потратил некоторое время на тестирование всех доступных вариантов, и было довольно сложно найти библиотеку, которая обеспечивает простой способ настройки простого Clojure Клиент WebSocket. (Чтобы быть справедливым, кажется, что это не очень распространено для клиента WebSocket для работы в контексте без браузера /JavaScript, поэтому, похоже, так много внимания уделяется клиентам ClojureScript WebSocket.)
Несмотря на то, что он не документирован, http.async.client оказался для меня наименьшим сопротивлением. Мне удалось успешно прочитать потоковые данные с сервера WebSocket и распечатать их на консоли, выполнив следующие действия:
(ns example.core
(:require [http.async.client :as client]))
(def url "ws://localhost:1337")
(defn on-open [ws]
(println "Connected to WebSocket."))
(defn on-close [ws code reason]
(println "Connection to WebSocket closed.\n"
(format "(Code %s, reason: %s)" code reason)))
(defn on-error [ws e]
(println "ERROR:" e))
(defn handle-message [ws msg]
(prn "got message:" msg))
(defn -main []
(println "Connecting...")
(let [client (client/create-client)
ws (client/websocket client
url
:open on-open
:close on-close
:error on-error
:text handle-message
:byte handle-message)]
(loop [] (recur))))
Бесконечный цикл в конце - это просто, чтобы процесс не заканчивался. Пока я не нажимаю Ctrl-C, сообщения, полученные из сокета, печатаются в STDOUT.
Я построил базовый клиент и сервер websocket, он использует java-сокеты и обертывает фреймы websocket. Он уникален тем, что сервер может одновременно принимать как стандартные соединения сокетов, так и веб-узлы.
http://github.com/viperscape/gulfstream
Пример кода клиента:
(def clienthandler
(with-conn server
(send! server "i'm here!")
(with-data server data (prn "client received" data))
(prn "client is now disconnected")))
(def ws-conn-details {:host "ws://echo.websocket.org/chat",:handler clienthandler})
(def client-conn (start-client ws-conn-details))