当我尝试使用
初始化在localhost上运行的服务器的websocket连接时var webSocket = new WebSocket("ws://localhost:8025/myContextRoot");
在javascript中,但服务器还没有完成启动,我收到错误
SCRIPT12029:WebSocket错误:网络错误12029,无法建立与服务器的连接
我该怎样防止这种情况?即如何检查服务器是否已经启动或如何强制WebSocket客户端等待服务器?
答案 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);