我编写了一个非常简单的广播/回显服务器,该服务器使用带有clojure和aleph的Web套接字。
我花了很多时间浏览aleph和lamina的资源,以基本体面了解这里发生的事情。
我想做的事
与客户建立联系
偶尔发送指令到服务器
根据有关连接的一些元数据,执行指令并向其他人发送响应
因此,这可以处理数据(很好)并格式化响应(很好)。如何获得仅将响应发送给相关方的信息?
到目前为止我有什么
(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..."}
我希望它执行“做某事...”命令,然后将结果输出发送给其他所有其最近的命令包括{“ room”:32,“ color”:“ red”}的人。
我不明白如何在Aleph中以这种方式管理连接...有什么帮助吗?
最佳答案
如果您想要更详细地了解谁接收什么消息,则需要比“广播频道”更详细的内容。 Lamina提供了(named-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
方法可确保客户端连接将从该特定通道接收所有消息,并返回一个取消该预订的函数。您需要具有一些保留这些取消回调的每个客户端状态,但我将其作为练习留给读者。