4

我正在尝试使用 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,因为它感觉更惯用。

4

1 回答 1

4

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

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

于 2012-05-02T19:23:10.280 回答