Node.js で WebSocket の接続が切れたときに再接続するメモ

Node.js で WebSocket の接続が切れたときに再接続するメモです。

WebSocket サーバーの性能によるのかちょっとわからないのですが、接続が切れやすいときがあって、そういう場合にサーバー側にクライアント側から再接続するときのソースを残しておきます。

ソースコード

このあたりの文献を参考に接続が切断されたときのイベントは取れることが分かったので、その時に再接続しています。

// WebSocket
const WebSocket = require('ws');

// WebSocket の接続先
let ws_url = 'ws://          .herokuapp.com/';

let ws;

function ws_connect(){
  ws = new WebSocket(ws_url);

  ws.on('open', function open() {
    console.log('-- ws open');
  });
  ws.on('message', function incoming(data) {
    console.log('-- ws message');
    console.log(data);
  });
  
  ws.on('close', function incoming(event) {
    console.log('-- ws close');
    // https://developer.mozilla.org/ja/docs/Web/API/CloseEvent
    // console.log('ws close.event',event);
    // https://developer.mozilla.org/ja/docs/Web/API/WebSocket/readyState
    // console.log('ws.readyState',ws.readyState);
    // 切断時に再接続する
    ws_connect();
  });
}

// 最初につなげる
ws_connect();

readyState で細かく状況分けしようと思いましたが、1006 Abnormal Closure であることが多かったので、とにかく切断イベントが来たときに発動するようにしました。

image

実行してみると、今回のつなげる先が比較的頻繁に切断されていましたが、その都度つなぎに行っています。実際、30分くらい放置しても何度もつないで維持されていたので、目的は達成できたかなと思います。

クライアント側のコードがサーバーの挙動を落としてしまうような挙動はないので、切断が多いサーバー自体を何とかしたほうがいい気もしますが、ひとまず。