【问题标题】:Handling websocket client messages with aleph使用 aleph 处理 websocket 客户端消息
【发布时间】:2014-11-09 09:25:39
【问题描述】:

在我学习 Clojure 的过程中,我目前遇到了设置 websocket 通信的问题。经过许多不同的方法后,我最终使用了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 服务器。我还设法通过手动流/获取从客户端获取消息!调用(也被注释掉了)。我需要弄清楚的是,当有东西进来时,如何自动触发这个动作。

提前感谢您的帮助!

【问题讨论】:

    标签: clojure websocket aleph


    【解决方案1】:

    您要查找的函数是(manifold.stream/consume callback stream),它将为来自流的每条消息调用回调。

    【讨论】:

    • 完美!奇迹般有效。谢谢扎克!
    • 还有一个问题。是否可以从消费回调函数体内向客户端发送消息?这似乎对我不起作用(没有任何反应)。另一方面,如果我手动评估发送代码,客户端会毫无问题地收到它。
    • 好的,想通了。通过将发送函数“映射”到流来发送消息。切换到doseq(用于解决副作用)而不是映射就可以了。
    【解决方案2】:

    This example 中,作者使用来自aleph 的recieve-allsiphon 来完成一项非常相似的任务,我将大致解释为:

    (let [chat (named-channel room (receive-all ch #(println "message: " %)))]
      (siphon chat ch)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-06
      • 1970-01-01
      • 2016-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-14
      相关资源
      最近更新 更多