GoでWebsocketを試してみる
GolangでのWebSocketの動作を確認したくていろいろと調べていて、実際に動かすことを優先して動かしてみた。
最初は自分で書いてみるかなーと思ったのだがまだまだそこまでの実力がないので、参考にさせてもらったサイトのサンプルコードを使わせてらうことにした。
http://wild-data-chase.com/index.php/2019/03/20/post-643/wild-data-chase.com
ここのサイトさん、すごくわかりやすくてSQLBoilerの時にも参考にさせてもらった。
サンプルを動かす
参考にしたサイトさんのサンプルリポジトリの中に入っているappはMac用にビルドされたものなので、Linuxでは動かなかった。
なので、以下のコマンドラインで実行した。
git clone https://github.com/NanairoMegane/chatFunc.git cd chatFunc go get github.com/gorilla/websocket go run *.go
こちらで正常に動くことを確認。
で、ブラウザでhttp://localhost:8080
にアクセスすることでWebsocketを使った基本的なチャットシステムの動作確認は取れた。
ここから本題
参考にしたサイトさんでは、別々のブラウザから実施していたが、片方はブラウザ、片方は別のWebsocketクライアントからやってみる。
別のWebsocketクライアントとして選んだのがBenthos。
CloudNativeのStream Processorです。Inputで受け取った形式のものを加工して、Outputの形式で出すことができます。
例えば、標準入力で受け取ったものをKafkaに投げるとか、httpのものをS3に送ったりとか、自分の中ではプロトコル変換みたいなことができるオープンソースのソフトウェアです。
InputとOutputは様々なものに対応していますので、Benthosのページで見てもらうとその数に驚きます。
こちらを使って、標準入力のものをWebSocketを使って先ほど建てたWebSocketサーバ宛に送ってみます。
Benthosのインストールは公式サイトに書いてある通り。以下の1行で済みます。
curl -Lsf https://sh.benthos.dev | bash
インストールが完了したら、コンフィグを作ります。
今回作ったコンフィグは標準入力で受け取ったものをWebSocketで出力するものです。
$ cat config.yaml input: label: "" stdin: codec: lines max_buffer: 1000000 output: label: "" websocket: url: ws://172.0.0.100:8080/room logger: level: DEBUG format: json add_timestamp: true static_fields: '@service': benthos prefix: benthos json_format: true $
コンフィグはconfig.yamlという名前で保存します。
そのコンフィグを使ってbenthosを実行します。正常起動すると以下のようなログ出力で止まります。
$ benthos -c ./config.yaml {"@timestamp":"2021-04-04T03:39:08Z","@service":"benthos","component":"benthos","level":"INFO","message":"Launching a benthos instance, use CTRL+C to close."} {"@timestamp":"2021-04-04T03:39:08Z","@service":"benthos","component":"benthos","level":"INFO","message":"Listening for HTTP requests at: http://0.0.0.0:4195"}
GoのWebsocketサーバのコンソール画面でもクライアントが入室しましたとちゃんと表示されました。
(一人はブラウザ、もう一人はBenthosで計2名です。)
WebsocketサーバのほうはJSONでメッセージを送る必要があるので、Benthosのターミナルから{"Message": "aaaaaaa", "Name": "yatta47"}
と送ってみると正常に表示されました。
やりたいことが確認できました。よしよし。
はまった点
最初にBenthosをDockerで動かして、起動したら速攻停止してしまったためそれを見て「???なぜか接続できない???」とだいぶ迷いました。
ちゃんとバックグラウンドで動かすようにすればよかったのかな。
Websocketサーバのほうも最初localhostでやっていたらどうにもBenthosが接続できなかった。そこをPrivateIPに変えたらつながるようになった。なぜlocalhostがダメだったのかはよくわからない。知っている人いたら教えて。
まとめ
ということでGolangを使ったWebsocketサーバの確認、ブラウザ以外の別クライアントの接続、そこからの信号送信が確認できました。
サーバプログラムのほうもこちらを改造して近いうちに作ってみようと思っています。
ではでは~。
参考サイト
WebSocket Recipe | Echo - High performance, minimalist Go web framework
http://wild-data-chase.com/index.php/2019/03/20/post-643/
Nginxでecho(golang)でWebSocket 「golang.org/x/net/websocket」編 - 自分用めも