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 を使用したいと思います。