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 に答える