Проверьте, работает ли сервер WebSocket (на локальном хосте)

Когда я пытаюсь инициализировать соединение websocket с сервером, работающим на localhost с

var webSocket = new WebSocket("ws://localhost:8025/myContextRoot");

в JavaScript, но сервер еще не завершил запуск, я получаю сообщение об ошибке

SCRIPT12029: ошибка WebSocket: ошибка сети 12029, не удалось установить соединение с сервером

Как я могу предотвратить это? Т.е. как я могу проверить, запущен ли уже сервер, или как заставить клиента WebSocket ждать сервера?

4 ответа

Решение

Как насчет:

var webSocketFactory = {
  connectionTries: 3,
  connect: function(url) {
    var ws = new WebSocket(url);
    ws.addEventListener("error", e => {
      // readyState === 3 is CLOSED
      if (e.target.readyState === 3) {
        this.connectionTries--;

        if (this.connectionTries > 0) {
          setTimeout(() => this.connect(url), 5000);
        } else {
          throw new Error("Maximum number of connection trials has been reached");
        }

      }
    });
  }
};

var webSocket = webSocketFactory.connect("ws://localhost:8025/myContextRoot");

Когда вы получаете ошибку соединения, вы можете сделать ограниченное количество пробных ошибок, чтобы попытаться повторно подключиться. Или вы можете бесконечно пытаться добраться до сервера.

Принятый ответ прекрасно. Я просто хотел бы еще немного расширить его обещаниями.

var wsFactory = { tryCount: 3,
                  connect : function(url){
                              var ctx = this,
                                  ws  = new WebSocket(url);

                              return new Promise(function(v,x){
                                                   ws.onerror   = e => { console.log(`WS connection attempt ${4-ctx.tryCount} -> Unsuccessful`);
                                                                         e.target.readyState === 3 && --ctx.tryCount;
                                                                         if (ctx.tryCount > 0) setTimeout(() => v(ctx.connect(url)), 1000);
                                                                         else x(new Error("3 unsuccessfull connection attempts"));
                                                                       };
                                                   ws.onopen    = e => { console.log(`WS connection Status: ${e.target.readyState}`);
                                                                         v(ws);
                                                                       };
                                                   ws.onmessage = m => console.log(m.data);
                                                 });
                            }
                };

wsFactory.connect("ws://localhost:8025/myContextRoot")
         .then(ws => ws.send("Hey..! This is my first socket message"))
         .catch(console.log);

Вы не можете предотвратить (или приостановить) запуск WebSocket / установление соединения. WebSocket автоматически устанавливает соединение с сервером при его объявлении. Что вы можете сделать, это поместить весь свой код внутри onopen обработчик событий, который вы хотите выполнить при успешном соединении. Так было бы как...

var webSocket = new WebSocket("ws://localhost:8025/myContextRoot");
webSocket.onopen = function() {
  // code you want to execute
};

проверьте эту статью, чтобы узнать больше о WebSocket.

Следовательно, протокол не может быть запрошен сервером, если он не запущен, единственным вариантом является метод проб и ошибок.

Или вы можете позволить серверу WebSocket создать простой текстовый файл с отметкой времени запуска в вашем каталоге веб-пространства, где javascript может получить его, а затем попытаться установить соединение. Вы можете получить текстовый файл с помощью XMLHttpRequest.

Другие вопросы по тегам