Javascript 我能赶上那辆车吗;can';“不要建立连接”;websocket连接失败时出错?

Javascript 我能赶上那辆车吗;can';“不要建立连接”;websocket连接失败时出错?,javascript,websocket,Javascript,Websocket,我需要测试与websocket服务器的连接是否已建立 此时,我可以连接到服务器,但我希望能够捕捉到无法访问该服务器的可能性,因此这个问题是关于当websocket连接无法建立或超时时该怎么办 仅使用Firefox中的基本websocket代码,它将在大约20秒后超时并调用我的错误处理程序。但它也会抛出一个JavaScript错误(至少对于我使用Firebug的人来说)显示在浏览器中。然后,日志显示: Firefox can't establish a connection to the serv

我需要测试与websocket服务器的连接是否已建立

此时,我可以连接到服务器,但我希望能够捕捉到无法访问该服务器的可能性,因此这个问题是关于当websocket连接无法建立或超时时该怎么办

仅使用Firefox中的基本websocket代码,它将在大约20秒后超时并调用我的错误处理程序。但它也会抛出一个JavaScript错误(至少对于我使用Firebug的人来说)显示在浏览器中。然后,日志显示:

Firefox can't establish a connection to the server at ws://192.168.0.1/.
到目前为止,我所尝试的:

  • 通过添加我自己的
    窗口来防止20秒超时。超时检查
    onopen
    处理程序是否已被调用,但不能防止JavaScript错误
  • 在我自己的超时结束时强制关闭websocket,但现在我得到了两个JavaScript错误-最初的加:

    加载页面时,与ws://192.168.0.1/的连接中断。

  • 在连接套接字和关闭套接字时,将
    try{}catch(e){}
    添加到我的代码中-无更改


关于如何使websocket错误不显示在浏览器中,您有什么想法吗?

到目前为止,我学到的是:您不能:0(

…因为这是特定于浏览器的行为

  • 所以你唯一能做的就是在ws-object上使用回调并祈祷
  • 只需覆盖
    控制台。日志
    ;0)
使用我所做的代码,但是我消除了一些错误消息,也许会有所帮助;)

e、 g:

  • Chrome不会抱怨服务器死机,而是默默地尝试重新连接
  • IE11仍然给出脚本错误
  • 等等
包装WS的基本类:看看回调

/**
 * Socket Class
 */
Client.Source.Network.Socket.Class = new Class({ implements: [Client.Source.Network.Socket.Interface] },function( Host, Port ){

var Configuration = {
    Server: {
        Protocol: 'ws',
        Host: Host,
        Port: Port
    },
    Event: {
        Open: function(){},
        Error: function(){},
        Message: function(){},
        Close: function(){}
    }
};

var Socket = null;

/**
 * @return {string}
 */
var HostUrl = function() {
    return Configuration.Server.Protocol + '://' + Configuration.Server.Host + ':' + Configuration.Server.Port + '/Connection'
};

/**
 * @returns {boolean}
 */
var IsSupported = function() {
    return "WebSocket" in window;
};

this.Open = function() {
    if( IsSupported() ) {
        Socket = new WebSocket( HostUrl() );
        Socket.onopen = Configuration.Event.Open;
        Socket.onerror = Configuration.Event.Error;
        Socket.onmessage = Configuration.Event.Message;
        Socket.onclose = Configuration.Event.Close;
    } else {

    }
};

this.Send = function( Text ) {
    Socket.send( Text );
};

this.Close = function() {
    Socket.close();
};

this.onOpen = function( Callback ) {
    Configuration.Event.Open = Callback;
};
this.onError = function( Callback ) {
    Configuration.Event.Error = Callback;
};
this.onMessage = function( Callback ) {
    Configuration.Event.Message = Callback;
};
this.onClose = function( Callback ) {
    Configuration.Event.Close = Callback;
};

});
看看Connect():onError(),onClose()函数

/**
 * Network Class
 */
Client.Source.Network.Class = new Class({ implements: [Client.Source.Network.Interface] },function(){

var _Self = this;
var Socket = null;

this.Connect = function( Host, Port ) {
    Socket = new Client.Source.Network.Socket.Class( Host, Port );
    Socket.onOpen(function(){
        _Self.Gui().Create( Client.Module.Client.Gui() );
        Client.Module.Chat.Message('Connected', 'green', 11);
        Client.Module.Audio.Play( 'Client.Resource.Audio.Chat.UserOnline', 0.2 );
    });
    Socket.onMessage( Response );
    Socket.onError(function(){
        Client.Module.Chat.Message('Connection Error', 'red', 11);
    });
    Socket.onClose(function(){
        _Self.Gui().Destroy();
        Client.Module.Chat.Message('Disconnected', 'darkred', 11);
        Client.Module.Chat.Message('Connecting...', 'orange', 11);
        window.setTimeout(function () {
            _Self.Connect( Host, Port );
        }, 2000);
    });
    Socket.Open();
};

this.Request = function( Application, Request, Data ) {
    Socket.Send( JSON.stringify( { Application: Application, Request: Request, Data: Data } ) );
};
var Response = function( Message ) {
    Message = JSON.parse( Message.data );
    Library[Message.Application].Execute( Message.Request, Message.Data );
};

var Library = {};
this.Protocol = function( Application, Callback ) {
    Library[Application] = Callback;
};

var GuiObject = null;
this.Gui = function Gui() {
    if( GuiObject === null ) {
        GuiObject = new Client.Source.Network.Gui();
    }
    return GuiObject;
};
});

您只想阻止websocket错误显示,还是禁止所有错误消息可以?这里的答案可能会有帮助:在这个时候,我只希望防止websocket错误——如果可能的话。如果没有,我可能不得不使用您发布的选项。谢谢不幸的是,我对WebSocket还不够熟悉,无法推荐一种专门针对这些错误进行过滤的方法。祝你好运!不用担心,谢谢检查+感谢你的专业知识!但请你简要解释一下上面的内容是什么?(哪些是捕获错误的关键行。)(顺便说一句,为什么代码不包含
WebSocket
,也不覆盖
console
,就像你提到的那样?)Thx:)我从我的一个库中剪切了示例,这样它就无法复制/粘贴,这只是为了解释一些事情。。第一个代码块是websocket对象的包装类。它调用
newwebsocket(HostUrl())this.Open()中的code>。陷阱在第二个代码块的外部处理,因此请查看
Socket.onError
回调。它不会覆盖控制台,因为它不打算这样做。。如果出现错误且回调未处理,您可以覆盖console.log,但它会终止浏览器调试功能,因此默认情况下它不在其中;)