WebSocket備忘録


はじめに

javascript歴3,4ヶ月の初心者です。
自分の備忘録用に書いていますが、本記事で指摘事項などありましたらコメントにて教えていただければ幸いです。

WebSocket通信でハマったこと

WebSocketとnode.jsを使っでソケット通信の勉強をしている時、node.jsでサーバーを立ち上げずに以下のコードを実行すると、エラーになる。

websocket.js
//これがエラーになる
var ws = new WebSocekt('ws://127.0.0.1:50000/');
window.addEventListener('open', function(e) {
    console.log('Socekt Open!');
});


このエラーが発生した後にサーバーを起動してもつながってはくれいない。
サーバーが起動していなくてもリトライをして、繋ぎに行く処理を作りたかった。

解決案

その1

脊髄反射でtry~catch文でエラーのところを囲めばどうにかなるかなと思って実行。

websocket.js
function socketConnect() {
    try{
        var ws = new WebSocekt('ws://127.0.0.1:50000/');
    } catch(e) {
        socketConnect();
    }
    window.addEventListener('open', function(e) {
        console.log('Socekt Open!');
    });
}

try~catchでエラーになったら再帰的に呼び出してもう一回同じ処理を実行するみたいな感じで書いてみたが、エラーは相変わらず出るし再帰呼び出しもされていなかった。

その2

WebSocketのイベントにあるcloseイベントでエラーを取得する。

websocket.js
 function socketConnect() {
    var ws = new WebSocekt('ws://127.0.0.1:50000/');
    window.addEventListener('open', function(e) {
        console.log('Socekt Open!');
    });
    window.addEventListener('close', function(e){
        socektConnect();
    });
}


エラーは変わらず出続けているけど、再帰呼び出しはできた!

まとめ

リファレンスによると次のように書かれている。

1006 Abnormal Closure 予約済。ステータスコードが必要なときに、接続が異常終了した (つまり、クローズフレームが送信されていない) ことを示すために使用されます。

つまり、サーバーを立てずに繋ぎに行こうとした場合このコードが取れるらしい。このコードの時は再帰呼び出しをするようにすれば、上記のエラーが起きてもサーバーが立つまで再接続ができる。
他にも成功時には"1000"、プロトコルエラーの時は"1002"といったように、クローズイベントのコードごとに対応するエラーがある(ユーザで設定することも可能)。