我编写了一个使用 web-sockets 的 web 应用程序。这个想法是我的应用程序在启动时尝试自动连接到最近连接到的主机。如果无法与其中任何一个建立连接,则将用户引导至连接部分并要求他们手动建立连接。
所有这些都有效。总之,我按顺序尝试每个已知主机,如果 200 毫秒后它还没有连接(`readyState!= 1),它会尝试下一个。所有这些主机都应该在 LAN 上,因此 200 毫秒的工作非常可靠。如果列表中的最后一个也失败了,那么网络会打开一个模式,指导用户手动输入主机。
问题是,通过尝试自动连接,我必须为我尝试的主机创建 websocket,它会向控制台输出如下错误消息:
WebSocket 连接到“ws://lightmate:8080/”失败:连接建立错误:net::ERR_NAME_NOT_RESOLVED
WebSocket 连接到“ws://localhost:8080/”失败:连接建立错误:net::ERR_CONNECTION_REFUSED
虽然无论如何都不是致命的缺陷,但它很难看并且妨碍了我的调试。
我试图通过new WebSocket(address)
用 try/catch 块包围调用来删除它,并且错误仍然通过,我还尝试设置一个onerror
处理程序,希望这会抑制错误消息。什么都没奏效。
connect: function(){
var fulladdr = completeServerAddress(address);
try {
connection = new WebSocket(fulladdr);
connection.suppressErrorsBecauseOfAutoConnection = suppressErrorsBecauseOfAutoConnection; //Store this module-scoped variable in connection, so if the module changes suppression state, this connection won't.
} catch (e){
//Make sure we don't try to send anything down this dead websocket
connection = false;
return false;
}
connection.binaryType = "arraybuffer";
connection.onerror = function(){
if (connection !== false && !connection.suppressErrorsBecauseOfAutoConnection){
Announce.announceMessage("Connection failed with server");
}
connection = false;
};
connection.onmessage = function(m){
rxMessage(ConnectionProtocol.BaseMessage.parseChunk(m.data));
};
connection.onclose = function(){
hooks.swing("disconnected", "", 0);
if (connection !== false && !connection.suppressErrorsBecauseOfAutoConnection){
Announce.announceMessage("Connection lost with server");
}
};
connection.onopen = function(){
sendMessages(ConnectionProtocol.HandshakeMessage.create(name, sources, sinks));
while (idlingmessages.length){
websocketConnection.send(idlingmessages.splice(0,1)[0]);
}
hooks.swing("connected", "", 0);
};
},
Dupl 免责声明:这个问题类似于这个 StackOverflow 问题,但是这个问题已经过时了一年,并且共识是“你不能”。我希望从那以后情况有所改变。