Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure WebSocket客户端_Clojure_Websocket_Client - Fatal编程技术网

Clojure WebSocket客户端

Clojure WebSocket客户端,clojure,websocket,client,Clojure,Websocket,Client,我已经使用http工具包设置了一个WebSocket服务器,它应该接受web套接字连接。这是http工具包文档中显示的基本示例 问题是: 如何创建连接到它的Clojure客户端 客户端可以是任何Clojure http库,我并不介意。我已经知道Javascript客户机,我相信Java有一个API可以从Clojure使用。但我要寻找的是一个Clojure库,它支持客户端和服务器的WebSocket。我在http工具包代码中没有看到任何东西可以让它变得简单。据我所知,http工具包支持web套接字

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

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

客户端可以是任何Clojure http库,我并不介意。我已经知道Javascript客户机,我相信Java有一个API可以从Clojure使用。但我要寻找的是一个Clojure库,它支持客户端和服务器的WebSocket。我在http工具包代码中没有看到任何东西可以让它变得简单。

据我所知,http工具包支持web套接字。如果您没有绑定到http kit客户机提供的异步设施,那么也可以使用。他们有一个非常相似的接口,看起来(我还没有使用CLJHTTP)



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

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

是Clojure的websocket客户端。它封装了的协议实现。

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

客户机代码示例:

(def clienthandler
(带conn服务器)
(发送!服务器“我在这里!”)
(带有数据服务器数据(prn“客户端接收”数据))
(prn“客户端现在已断开”))
(def-ws-conn-details{:host“ws://echo.websocket.org/chat”,:handler-clienthandler})
(def客户端连接(启动客户端ws-conn详细信息))

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

虽然没有很好的记录,但最终对我来说,这条路阻力最小。通过执行以下操作,我能够成功地从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之前,从套接字接收的消息将打印到标准输出。

我已经看到了。它支持服务器,但我找不到一种方法来创建一个http工具包客户端来连接到我的服务器(可能有一些明显的东西我错过了)。异步会很好,但现在没有必要。您是否曾经使用clj http连接到服务器?或者只是反过来?我连接到localhost(并从web API中提取数据),不记得有任何问题。免责声明:到目前为止,我对Clojure几乎没有经验,只是对该工具集进行了实验。这正是我所寻找的。。。由于某些原因,我无法找到如何在文档中创建客户机。你能给我举个例子吗?@user2263578添加了一个代码示例,尽管你确实找到了解决方法。是的,它使用aleph。我的错误。你想使用Clojure websocket客户端来简化事情吗?非基于web的客户端实际上不是websockets的用例,这解释了为什么缺少Clojure客户端。但是,如果您在Google上搜索Java websocket客户端,您可能会找到一些,那么您可以使用interop在Clojure中设置Java客户端。我知道这不是通常的用例。我看到了java版本,我只是想知道在Clojure中是否可以使用现有的库。看起来应该是这样的,因为http客户端确实存在。找到了,谢谢。我之前已经排除了这种可能性,因为函数名很奇怪,但这显然是一个错误。作者的回答是,是的!谢谢你的回答。我已经选定了艾利夫,所以我会坚持下去。http.async看起来也是一个不错的选择,不过.http-kit现在支持WebSocket了!对于一个开箱即用的非常好的示例,有一个非常好的示例,尽管对于我们2019年加入的人来说,您需要更新所有库,因为他们示例的一些依赖项在java 11中已被弃用。我用叉子叉的,就是为了你做的。您仍然需要保持Inifinite循环,使其不关闭——将其添加到聊天处理程序中。正确的方法是将nginx设置为使websockets保持打开状态,并使其保持所需的秒数。更好的方法是使用常量ping函数使连接保持活动状态。
(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))