Clojure中的WebSocket客户端(Clojure WebSocket Client)

2019-09-02 06:32发布

我一直在使用HTTP的工具包,应该接受网络套接字连接建立一个WebSocket的服务器。 它是HTTP的试剂盒文档中示出的基本示例。

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

客户端可以是任何Clojure的HTTP库,我不介意。 我已经知道了JavaScript客户端,我相信Java有,我可以从Clojure中使用的API。 但是,我期待的是, 同时支持客户端服务器的WebSockets一个Clojure的库。 我看到HTTP-kit的代码没有什么会让它容易些。

Answer 1:

艾礼富对服务器和客户端上的WebSockets支持。 这可能需要一些时间来适应异步风格和ALEPH的核心抽象,但它是一个很好的工具,一旦你得到了它的窍门。



Answer 2:

HTTP-KIT的客户端不支持WebSocket的,但(我想不出一个好的API的吧)。 阿列夫是这种情况下,使用一个很好的选择。 另一种选择是http.async.client ,我用它在HTTP-KIT的服务器的WebSocket的单元测试: 在这里



Answer 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!")


Answer 4:

Gniazdo是Clojure的一个WebSocket的客户端。 它包装码头的执行协议。



Answer 5:

对于那些在2015年加入我们的行列:是新来这个,我只花了一会尝试所有可用不同的选择,这是相当困难的发现提供了一种简单的方法来建立一个简单的Clojure的WebSocket客户端库。 (公平地说,好像这不是很常见的一个WebSocket的客户端在非浏览器/ JavaScript的背景下,这就是为什么有似乎是如此强调Clojure的脚本的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。



Answer 6:

我构建了一个基本的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))


文章来源: Clojure WebSocket Client