我正在尝试使用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