rustでtelnetチャットを書いた

ソケットプログラミングの練習でよくあるアレをrustで書いてみた。

https://github.com/gifnksm/telnet-chat

クライアントプログラム書くのがダルかったので、telnet を使う仕様にした。 \ から始まるコマンドを打つことで、参加者一覧を出したりできる。 練習のため、通信関係の処理はすべて標準ライブラリのものを利用している。 雑に設計して雑に書いたので無駄なスレッド生成とかいっぱいしているけどそれはご愛敬。 もうちょっと改善したいけど連休も終わるのでひとまず投稿した次第です。

  • Rust だからといって、並列プログラミングが超お手軽に書けるわけではない。異常系処理をきちんと作り込んむためにはスレッド間のやりとりなどはきちんとした設計が必要。
  • とはいえCで書くよりは断然楽。enum とパターンマッチ最高という思いを強くした。型定義だけでプロトコルが定義できるのは分かりやすい。C APIを叩く準備などの細かい処理に意識をとらわれず、本質的な論理に集中できるというのもやはり良い。move semantics や borrow checker のおかげでスレッド間のデータの排他についてそれほど気を遣わなくて良いのも大きい。
  • 一番ハマったのは、socket 全然関係無く docopt の使い方。 let arg: Args = Args::docopt()...: Args を書き忘れたばっかりに、decode 処理で実行時エラーになっていた。どうも型指定省略すると args の型が () になるっぽい。謎。
  • socket とか channel が Rust のライブラリで抽象化されているため、C で書いたときのようにどんな場合にどんなエラーが返ってくるのか man で調べつつ書く、というのができなくてエラー処理をどうすれば良いのか (リカバリ可否の判断とか) が判断できない局面があった。クロスプラットフォーム対応のために難しいのかもしれないけど、もう少しドキュメントに詳細なエラー原因とかがあると良いと思った。

ちゃんとしたサーバアプリケーションを書くならば、mio とか使うのがよさそう。