Clojure WebSocket客户端

use*_*578 15 client clojure websocket

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

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

客户端可以是任何Clojure http库,我真的不介意.我已经了解了Javascript客户端,我相信Java有一个我可以在Clojure中使用的API.但是,我期待的是支持WebSockets的一个Clojure的库为客户端服务器.我在http-kit代码中没有看到任何可以轻松实现的内容.

ama*_*loy 10

aleph支持服务器和客户端上的websockets.可能需要一些时间来习惯异步样式和aleph的核心抽象,但是一旦掌握了它,它就是一个非常好的工具.


小智 9

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

  • http-kit现在支持websockets! (2认同)

Jan*_*Jan 8

Gniazdo是Clojure的WebSocket客户端.它包含了Jetty对协议的实现.


i-b*_*lis 7

根据这一公告,http-kit支持Web套接字.如果您不受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!")
Run Code Online (Sandbox Code Playgroud)


Dav*_*ood 7

对于那些在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))
Run Code Online (Sandbox Code Playgroud)

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

  • 对于开箱即用的[http-kit版本](https://www.http-kit.org/server.html#channel),有一个非常好的[聊天应用程序](https://www.http-kit.org/server.html#channel)示例/github.com/http-kit/chat-websocket)尽管对于我们这些在 2019 年加入的人来说,您需要更新所有库,因为其示例的一些依赖项已在 java 11 中弃用。我在 [此处]( https://github.com/cycle337/chat-websocket)并为您完成了这项工作。您仍然需要保留 inifinte 循环,以免其关闭 - 将其添加到聊天处理程序中。 (2认同)