Clojure TCP Server with Aleph



我正在尝试使用Aleph编写一个简单的TCP服务器。 一切正常,除了我不确定我应该如何检测通道何时关闭。

从文档中:

当客户端关闭连接时,通道的两端将立即密封。 来自频道的最终消息将为 nil

但是,我似乎从未收到过这最后nil消息。 如果我检查频道,我确实看到它已被关闭。 这是我的代码:

(use 'lamina.core 'aleph.tcp 'gloss.core)
(defn process-msg [ch msg]
  (if (closed? ch)
    (println "Channel has been closed") ;This never happens
    (do-some-processing msg)))
(start-tcp-server
  (fn [ch client-info]
    (receive-all ch
      (partial process-msg ch))
  {:port 10000, :frame (string :utf-8 :delimiters ["n"])})

我应该做一些不同的事情吗? 我的框架是否阻止处理 nil 消息? 我可以有一个单独的线程监控我的频道并检查它们是否已关闭,但这似乎是一个糟糕的设计。 我更喜欢使用 Aleph,但现在看起来我需要使用原始的 Netty 处理程序。 直接使用 Netty 会很好,但如果可能的话,我更喜欢使用 Aleph,因为它感觉更习惯

要在通道关闭或耗尽时注册回调,请使用 (on-closed ch 回调( 或 (on-drained ch 回调(,它们都接受参数为零的回调。

https://github.com/ztellman/lamina/wiki/Channels

最新更新