首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用aleph处理websocket客户端消息

用aleph处理websocket客户端消息
EN

Stack Overflow用户
提问于 2014-11-09 09:25:39
回答 2查看 1.2K关注 0票数 2

在我寻求学习Clojure的过程中,我目前面临着建立websocket通信的问题。经过许多不同的方法之后,我最终使用了阿列弗

我所取得的成就:

  • 新客户端连接的处理
  • 处理客户端断开连接
  • 随心所欲地从服务器到客户端交谈

我所缺少的是,每当一个连接的客户端通过websocket发送一些东西时,就可以触发一个处理程序函数。

到目前为止我的代码是:

代码语言:javascript
复制
(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服务器。我还设法通过手动流/抓取从客户端获取消息!呼叫(也评论掉)。我需要弄清楚的是,当有什么东西进来的时候,如何自动触发它。

提前感谢您的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-09 10:44:31

您要寻找的函数是(manifold.stream/consume callback stream),它将为流中的每个消息调用回调。

票数 4
EN

Stack Overflow用户

发布于 2014-11-09 09:55:44

这个例子中,作者使用来自aleph的recieve-allsiphon来完成一个非常类似的任务,我将大致解释为:

代码语言:javascript
复制
(let [chat (named-channel room (receive-all ch #(println "message: " %)))]
  (siphon chat ch)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26826802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档