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 とか使うのがよさそう。