我编写了一个非常简单的广播/回显服务器,该服务器使用带有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方法可确保客户端连接将从该特定通道接收所有消息,并返回一个取消该预订的函数。您需要具有一些保留这些取消回调的每个客户端状态,但我将其作为练习留给读者。

10-07 13:17