Clojure Клиент WebSocket

Я установил сервер WebSocket, используя http-kit, который должен принимать соединения веб-сокетов. Это основной пример, показанный в документации http-kit.

Вопрос: Как создать клиент Clojure, который подключается к нему?

Клиент может быть любой Clojure http-библиотекой, на самом деле я не против. Я уже знаю о клиентах Javascript, и я считаю, что Java имеет API, который я мог бы использовать из Clojure. Но я ищу библиотеку Clojure, которая поддерживает websockets и для сервера и. Я ничего не видел в http-kit-коде, который облегчил бы его.

Ответы

Ответ 1

aleph поддерживает веб-порты как на сервере, так и на клиенте. Это может занять некоторое время, чтобы привыкнуть к асинхронному стилю и аберрациям алеф-ядра, но это очень хороший инструмент, как только вы получите его.

Ответ 2

Клиент http-kit еще не поддерживает WebSocket (я не могу придумать для него хороший API). Алеф - хороший вариант для такого использования. Другим вариантом является http.async.client, я использовал его в веб-узле http-kit websocket unit test: здесь

Ответ 3

Согласно этому объявлению, 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!")

Ответ 4

Gniazdo является клиентом WebSocket для Clojure. Он завершает реализацию протокола Jetty.

Ответ 5

Для тех, кто присоединился к нам в 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.

Ответ 6

Я построил базовый клиент и сервер 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))