18

我已经使用 http-kit 设置了一个 WebSocket 服务器,它应该接受 Web 套接字连接。它是 http-kit 文档中显示的基本示例。

问题是: 如何创建连接到它的 Clojure 客户端?

客户端可以是任何 Clojure http 库,我并不介意。我已经了解 Javascript 客户端,并且我相信 Java 有一个我可以从 Clojure 使用的 API。但我正在寻找的是一个支持客户端和服务器的 websocketClojure。我在 http-kit 代码中没有看到任何可以让它变得简单的东西。

4

6 回答 6

11

aleph在服务器和客户端都支持 websocket。习惯异步风格和 aleph 的核心抽象可能需要一些时间,但是一旦你掌握了它,它就是一个非常好的工具。

于 2013-05-08T22:33:57.900 回答
9

Gniazdo是 Clojure 的 WebSocket 客户端。它包装了Jetty的协议实现。

于 2013-11-10T09:32:17.837 回答
9

http-kit 的客户端还不支持 WebSocket(我想不出一个好的 API)。对于这种用例,Aleph 是一个不错的选择。另一个选项是http.async.client,我在 http-kit 的服务器的 websocket 单元测试中使用了它:这里

于 2013-05-16T15:48:42.497 回答
8

对于那些在 2015 年加入我们的人:作为新手,我只是花了一些时间尝试了所有可用的不同选项,而且很难找到一个库来提供一种简单的方法来设置一个简单的 Clojure WebSocket 客户端。(公平地说,WebSocket 客户端在非浏览器/JavaScript 上下文中运行似乎并不常见,这就是为什么似乎如此强调 Clojure Script WebSocket 客户端的原因。)

尽管没有很好的文档记录,但 http.async.client最终成为了我阻力最小的路径。通过执行以下操作,我能够成功地从 WebSocket 服务器读取流数据并将其打印到控制台:

(ns example.core
  (:require [http.async.client :as async]))

(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...")
  (-> (async/create-client)
      (async/websocket url
                       :open  on-open
                       :close on-close
                       :error on-error
                       :text  handle-message
                       :byte  handle-message))
  ;; Avoid exiting until the process is interrupted.
  (while true))

最后的无限循环只是为了防止过程结束。在我按下 Ctrl-C 之前,从套接字接收到的消息都会打印到 STDOUT。

于 2015-08-15T23:56:09.577 回答
7

根据这个公告,http-kit 支持 web sockets。如果您不受 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!")
于 2013-05-08T21:24:00.710 回答
1

我构建了一个基本的 websocket 客户端和服务器,它使用 java 套接字并包装 websocket 框架。它的独特之处在于服务器可以同时接受常规套接字连接和 websockets。

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))
于 2014-02-17T15:38:09.383 回答