gpt4 book ai didi

clojure - 使用 aleph 处理 websocket 客户端消息

转载 作者:行者123 更新时间:2023-12-02 15:29:31 25 4
gpt4 key购买 nike

在我学习 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 服务器。我还设法通过手动流/接收从客户端获取消息!调用(也已注释掉)。我需要弄清楚的是,当有东西进来时如何自动触发此操作。

预先感谢您的帮助!

最佳答案

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

关于clojure - 使用 aleph 处理 websocket 客户端消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26826802/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com