gpt4 book ai didi

clojure - 基于元数据管理 Aleph (clojure) 中的连接

转载 作者:行者123 更新时间:2023-12-02 16:17:05 25 4
gpt4 key购买 nike

我编写了一个非常简单的广播/回显服务器,它使用带有 clojure 和 aleph 的 Web 套接字。

我花了很多时间查看 aleph 和 lamina 来源,以对这里发生的事情有一个体面的、基本的了解。

我想做什么

  1. 与客户端建立连接
  2. 偶尔向服务器发送指令
  3. 执行指令并根据有关连接的一些元数据向其他人发送响应

因此,这可以处理数据(这很棒)并格式化响应(这很棒)。我怎样才能让它只将回复发送给相关方?

到目前为止我所拥有的

(defn do-something
[arg]
(str "pickles" "are" "nice" arg))

(defn ws-handler [ch request]
(siphon (map* #(do-something %) ch) broadcast-channel)
(siphon broadcast-channel ch))

(defn -main
"Start the http server"
[& args]
(start-http-server ws-handler {:port 8080 :websocket true}))

请求示例

假设我有一个 JSON 格式的请求:

{"room":32, "color":"red", "command":"do something..."}

我希望它执行“do some...”命令,然后将结果输出发送给最近命令包含 {"room":32, "color":"red"} 的其他人.

我不明白如何在 aleph 中以这种方式管理连接...有什么帮助吗?

最佳答案

如果您想要更详细地了解谁接收什么消息,您需要比“广播 channel ”更精细的东西。 Lamina 提供了一个(named-channel ...) 函数,允许您创建自己的 channel 命名空间。

这看起来像:

(defn broadcast [channel-name message]
(enqueue (named-channel channel-name nil) message))

(defn subscribe [channel-name client-channel]
(let [bridge-channel (channel)]
(siphon
(named-channel channel-name nil)
bridge-channel
client-channel)
#(close bridge-channel)))

在这种情况下,subscribe 方法确保客户端连接将从该特定 channel 接收所有消息,并返回一个将取消该订阅的函数。您需要有一些保留这些取消回调的每个客户端状态,但我将把它留给读者作为练习。

关于clojure - 基于元数据管理 Aleph (clojure) 中的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16566265/

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