Javascript 如果Websocket连接可以';别做别的事

Javascript 如果Websocket连接可以';别做别的事,javascript,jquery,websocket,Javascript,Jquery,Websocket,我现在遇到了一个你们可以帮我解决的问题 我正在使用WebSocket连接到自定义服务器。现在,如果第一个服务器IP不可用,我想集成第二个服务器IP 如何检测到由于无法访问服务器而无法建立连接?例如,当我在脚本中输入错误的ws://url时,Chrome会显示以下错误: WebSocket连接到'wss://1234/'失败:建立连接时出错:net::ERR\u NAME\u未\u解析 在Firefox中,它是完全不同的。你们有什么方法可以用Javascript捕捉这个错误吗 基本上,当无法访问w

我现在遇到了一个你们可以帮我解决的问题

我正在使用WebSocket连接到自定义服务器。现在,如果第一个服务器IP不可用,我想集成第二个服务器IP

如何检测到由于无法访问服务器而无法建立连接?例如,当我在脚本中输入错误的ws://url时,Chrome会显示以下错误:

WebSocket连接到'wss://1234/'失败:建立连接时出错:net::ERR\u NAME\u未\u解析

在Firefox中,它是完全不同的。你们有什么方法可以用Javascript捕捉这个错误吗

基本上,当无法访问ws://url时,我想用不同的服务器IP更改一个变量,然后用这个变量再试一次


谢谢你的帮助

假设您的代码是这样的

var host = 'ws://a.real.websocket.url';
var socket = new WebSocket(host);
。。。您只需要在对
newwebsocket
的调用中加入一个try/catch块,如下所示

try {
  var socket = new WebSocket(host);
} catch (e) {
  // inspect e to understand why there was an error
  // and connect to another url if necessary
}

也就是说,使用诸如Socket.IO或SockJS()之类的websockets库可能更容易,这样可以将重新连接代码逻辑更改为库提供的任何代码。

假设您的代码是这样的

var host = 'ws://a.real.websocket.url';
var socket = new WebSocket(host);
。。。您只需要在对
newwebsocket
的调用中加入一个try/catch块,如下所示

try {
  var socket = new WebSocket(host);
} catch (e) {
  // inspect e to understand why there was an error
  // and connect to another url if necessary
}
话虽如此,使用诸如Socket.IO或SockJS()之类的WebSocket库可能会更容易,这样可以将重新连接代码逻辑更改为库提供的任何代码。

谢谢@orbitbot

我正在使用一个名为jwebsocket(jwebsocket.org)的框架。我的代码基本上是这样的:

serverstate=“0”;
log(serverstate);
函数登录(){
如果(服务器状态=“0”){
卢尔=”wss://testurl-one:9797";
}else if(serverstate==“1”){
卢尔=”wss://testurl-two:9797";
}
var gUsername=“用户”;
var lPassword=“通过”;
log(“连接到“+lURL+”和console.logging为“'+gUsername+”…”);
var lRes=lWSC.logon(lURL、gUsername、lPassword、{
//开放回调
OnOpen:功能(aEvent){
log(“建立了jWebSocket连接”);
},
//OnMessage回调
OnMessage:function(aEvent、aToken){
var lDate=“”;
如果(aToken.date\u val){
lDate=jws.tools.ISO2Date(aToken.date\u val);
}
日志(“jWebSocket'+aToken.type+”,收到令牌,完整消息:“+aEvent.data+”“+lDate+”);
控制台日志(aToken);
}
},
//OnClose回调
OnClose:函数(aEvent){
日志(“从服务器断开”);
log(“使用下一个服务器…”);
serverstate=“1”;
log(serverstate);
log(“尝试连接到下一台服务器”);
登录();
},
//OnClose回调
OnError:功能(aEvent){
console.log(“出现了一些错误”);
}
});
log(lWSC.resultToString(lRes));
}
谢谢@orbitbot

我正在使用一个名为jwebsocket(jwebsocket.org)的框架。我的代码基本上是这样的:

serverstate=“0”;
log(serverstate);
函数登录(){
如果(服务器状态=“0”){
卢尔=”wss://testurl-one:9797";
}else if(serverstate==“1”){
卢尔=”wss://testurl-two:9797";
}
var gUsername=“用户”;
var lPassword=“通过”;
log(“连接到“+lURL+”和console.logging为“'+gUsername+”…”);
var lRes=lWSC.logon(lURL、gUsername、lPassword、{
//开放回调
OnOpen:功能(aEvent){
log(“建立了jWebSocket连接”);
},
//OnMessage回调
OnMessage:function(aEvent、aToken){
var lDate=“”;
如果(aToken.date\u val){
lDate=jws.tools.ISO2Date(aToken.date\u val);
}
日志(“jWebSocket'+aToken.type+”,收到令牌,完整消息:“+aEvent.data+”“+lDate+”);
控制台日志(aToken);
}
},
//OnClose回调
OnClose:函数(aEvent){
日志(“从服务器断开”);
log(“使用下一个服务器…”);
serverstate=“1”;
log(serverstate);
log(“尝试连接到下一台服务器”);
登录();
},
//OnClose回调
OnError:功能(aEvent){
console.log(“出现了一些错误”);
}
});
log(lWSC.resultToString(lRes));

}
我明白了。。对于其他感兴趣的人:


建立连接后,您将收到来自该服务器的消息。因此,如果服务器不可用。。没有消息了。所以我只是在“OnMessage”部分添加了一个变量。。在断开连接中,我检查是否收到消息。如果没有,服务器就不在那里。。如果是,一切正常。

我知道了。。对于其他感兴趣的人:


建立连接后,您将收到来自该服务器的消息。因此,如果服务器不可用。。没有消息了。所以我只是在“OnMessage”部分添加了一个变量。。在断开连接中,我检查是否收到消息。如果没有,服务器就不在那里。。如果是,一切正常。

似乎没有办法在实例化时发现问题,尽管神奇的JavaScript黑盒似乎知道问题发生在新的WebSocket上

要检测此错误,请使用以下命令:

ws = new WebSocket(server);

ws.onerror = function (evt) {
    if (ws.readyState == 3) {
        //Connection closed.
    }
}

尽管神奇的JavaScript黑盒似乎知道问题发生在新的WebSocket上,但似乎无法在实例化时发现问题

要检测此错误,请使用以下命令:

ws = new WebSocket(server);

ws.onerror = function (evt) {
    if (ws.readyState == 3) {
        //Connection closed.
    }
}

您可以随时使用ajax长轮询。嘿@3boll,谢谢!你能详细解释一下吗?我从未使用过ajax长轮询。。谷歌的一项研究对我也没有多大帮助。Socket.IO()是一个项目,如果浏览器不支持WebSocket,它会自动回退到长轮询,所以如果需要的话,你可能想研究一下