ArticlesGolangでWebSocketサーバ書いた最近はPHPでステートレスなアプリばかり書いてたので、今更感はありますが息抜きに時間を見つけて書いてみました。参考にしたのは当たり前だけどRFC6455です。これを満たすように実装してみました。GolangにはすでにWebSocketのパッケージがあるのでそれ使うのがいいです。今回は勉強ってことで、httpは使わず生のnetとcrypto/tlsパッケージを使う縛りで、handshakeから実際にコネクションを張ってメッセージフレームをやり取りしたりbroadcastするところまでやりました。仕様的にGETっぽいリクエストしか処理しないし、計測はしてないけどそのままTCPでやった方がパフォーマンス出るんじゃないかと。あとgoroutineとchannelでの非同期周りをちゃんとやりたかった。作ったのはこちらです。レスポンスの処理は生のTCPソケットでやったので、解析とかも自前でした。いうよりも、socketを継続して待ち受けて、適切なところにメッセージングするのが難しかった印象。ループで待ち受ける感じが定石なのかな。}}goroutineで起動する関数は公開しないようにして、何かマーク付けて置いたほうがいいのかも。メッセージ受信/送信のそれぞれの用途のchannelを作って、TCPソケットからメッセージを読み取ったタイミングで適切なchannelに送信すればOKです。今回は各channelに対して統一したインターフェースを要求するようにしたことで、ハンドシェイクでもメッセージでも平文でも上手く扱えたのでこれは良かったかと。lengthの扱いとmaskingがちょっと面倒なくらいでした。あとはこのデータを送受信することで、Chrome/Firefoxで動作させることができました。感想とか改めてシンプルなプロトコルだなー、と。ファイル数も少なかったし、バイナリは試してないけど、メッセージ自体も小さかったです。セキュリティ周りは気になるところですが、今回大元の部分を理解できたので、専用にカスタムヘッダで認証したり、メッセージフレームをちょっといじったりしてオリジナルの要件に合わせられるような気もしました。久々に書いてて楽しかったですね。cliで起動出来るようにしてるので、スポットでWebSocketな双方向通信が必要な時にさっくり使えるかも知れません。通常はgolang.org/x/net/websocketを使いましょう。