/var/www/yatta47.log

/var/www/yatta47.log

やったのログ置場です。スクラップみたいな短編が多いかと。

GoでWebsocketを試してみる

f:id:yatta47:20210117125924p:plain

GolangでのWebSocketの動作を確認したくていろいろと調べていて、実際に動かすことを優先して動かしてみた。

最初は自分で書いてみるかなーと思ったのだがまだまだそこまでの実力がないので、参考にさせてもらったサイトのサンプルコードを使わせてらうことにした。

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

こちらで正常に動くことを確認。

f:id:yatta47:20210404174024p:plain

で、ブラウザでhttp://localhost:8080にアクセスすることでWebsocketを使った基本的なチャットシステムの動作確認は取れた。

 

ここから本題

参考にしたサイトさんでは、別々のブラウザから実施していたが、片方はブラウザ、片方は別のWebsocketクライアントからやってみる。

別のWebsocketクライアントとして選んだのがBenthos。

www.benthos.dev

CloudNativeのStream Processorです。Inputで受け取った形式のものを加工して、Outputの形式で出すことができます。

例えば、標準入力で受け取ったものをKafkaに投げるとか、httpのものをS3に送ったりとか、自分の中ではプロトコル変換みたいなことができるオープンソースのソフトウェアです。

InputとOutputは様々なものに対応していますので、Benthosのページで見てもらうとその数に驚きます。

Inputs | Benthos

Outputs | 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サーバのコンソール画面でもクライアントが入室しましたとちゃんと表示されました。

f:id:yatta47:20210404175918p:plain

(一人はブラウザ、もう一人は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

[ golang ] WebSocketを使ったチャット機能を実装してみる。 | Wild Data Chase -データを巡る冒険-

WebSocketをGoで触ってみた - Qiita

Nginxでecho(golang)でWebSocket 「golang.org/x/net/websocket」編 - 自分用めも

websocket | Benthos