在我学习Clojure的过程中,我目前面临着设置websocket Communitation的问题。经过许多不同的方法后,我最终使用了aleph。
我设法实现的目标:
我缺少的是每当其中一个连接的客户端通过websocket发送内容时触发处理函数。
到目前为止我的代码:
(ns wonders7.core.handler
(:require [compojure.core :refer :all]
[compojure.route :as route]
[ring.middleware.defaults :refer [wrap-defaults site-defaults]]
[aleph.http :as http]
[manifold.stream :as stream]
[clojure.tools.logging :refer [info]]))
(defn uuid [] (str (java.util.UUID/randomUUID)))
(def clients (atom {}))
(defn ws-create-handler [req]
(let [ws @(http/websocket-connection req)]
(info "ws-create-handler")
(stream/on-closed ws #(swap! clients dissoc ws))
(swap! clients assoc ws (uuid))))
(defroutes app-routes
(GET "/ws" [] ws-create-handler)
(route/not-found "Not Found"))
(def app
(wrap-defaults app-routes site-defaults))
(defn msg-to-client [[client-stream uuid]]
(stream/put! client-stream "The server side says hello!"))
(defn msg-broadcast []
(map #(msg-to-client %) @clients))
;(stream/take! (first (first @clients)))
;(http/start-server app {:port 8080})
我使用注释掉的http / start-server aleph调用启动Netty服务器。我还设法通过手动流/取来从客户端获取消息!打电话(也注释掉了)。我需要弄清楚的是如何在出现问题时自动触发。
提前感谢您的帮助!
答案 0 :(得分:4)
您正在寻找的功能是(manifold.stream/consume callback stream)
,它将为流中的每条消息调用回调。
答案 1 :(得分:1)
在This example中,作者使用了来自aleph的recieve-all
和siphon
来完成一项非常相似的任务,我将其粗略地解释为:
(let [chat (named-channel room (receive-all ch #(println "message: " %)))]
(siphon chat ch)