检查WebSocket服务器是否正在运行(在localhost上)

时间:2017-02-08 12:17:19

标签: javascript websocket

当我尝试使用

初始化在localhost上运行的服务器的websocket连接时
var webSocket = new WebSocket("ws://localhost:8025/myContextRoot");

在javascript中,但服务器还没有完成启动,我收到错误

SCRIPT12029:WebSocket错误:网络错误12029,无法建立与服务器的连接

我该怎样防止这种情况?即如何检查服务器是否已经启动或如何强制WebSocket客户端等待服务器?

4 个答案:

答案 0 :(得分:9)

怎么样:

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");

当您收到连接错误时,您可以尝试重新连接数量有限的试错。或者你可以无休止地尝试访问服务器。

答案 1 :(得分:1)

您无法阻止(或暂停)WebSocket启动/建立连接。 WebSocket在声明时自动与服务器建立连接。您可以做的是将所有代码放在要在成功连接时执行的onopen事件处理程序中。所以它就像......

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

查看this文章,了解有关WebSocket的更多信息。

答案 2 :(得分:1)

因此,如果服务器未启动,则无法查询协议,唯一的选择是试错。

或者您可以让WebSocket服务器在您的Web空间目录中创建一个简单的文本文件,其中包含启动时间戳,javascript可以在其​​中检索它,而不是尝试建立连接。您可以使用XMLHttpRequest检索文本文件。

答案 3 :(得分:0)

接受的答案非常好。我只是希望通过承诺进一步扩展它。

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);