2012-05-02 21 views
4

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

documentation

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

但是,我似乎没有收到此最终的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"])}) 

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

回答

4

要注册的回调用于当一个信道被关闭或倒掉,用(上封闭通道的回调)或(上排水通道回调),其中两个搭回调零个参数。

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

+0

感谢。这正是我所期待的。我没有想过检查Lamina文档。 – dbyrne