简体   繁体   English

对于失败的websocket连接,我可以捕获“无法建立连接”错误吗?

[英]Can I catch the “can't establish a connection” error for a failed websocket connection?

I need to test if the connection to my websocket server is established or not. 我需要测试是否建立了与websocket服务器的连接。

At this time, I CAN connect to the server, but I want to be able to catch the possibility of that server not being reachable, so this question is about what to do when the websocket connection cannot be established or when it times out. 这时,我可以连接到服务器,但我希望能够捕获该服务器无法访问的可能性,所以这个问题是关于无法建立websocket连接或超时时该怎么办。

Using just the basic websocket code in Firefox, it will timeout in about 20 seconds and call my error handler. 仅使用Firefox中的基本websocket代码,它将在大约20秒内超时并调用我的错误处理程序。 But it will also throw a JavaScript error that (at least for me using Firebug) shows up in the browser. 但它也会抛出一个JavaScript错误(至少对我来说使用Firebug)会出现在浏览器中。 The log then shows: 然后日志显示:

Firefox can't establish a connection to the server at ws://192.168.0.1/.

What I've tried so far: 到目前为止我尝试过的:

  • Prevent the 20 second timeout by adding my own window.timeout that checks if the onopen handler has been called yet or not, but that does not prevent the JavaScript error. 加入我自己的防止20秒超时window.timeout来检查,如果在onopen处理程序被调用但还是不行,但这并不妨碍JavaScript错误。
  • Force-close the websocket at the end of my own timeout, but now I get TWO JavaScript errors - the original plus: 在我自己的超时结束时强制关闭websocket,但现在我得到两个JavaScript错误 - 原来的加号:

    The connection to ws://192.168.0.1/ was interrupted while the page was loading.

  • Adding try {} catch(e) {} to my code, both when connecting the socket and closing it - no change. try {} catch(e) {}到我的代码中,无论是在连接套接字还是关闭它时 - 都没有变化。

Any ideas on how to get websocket errors to not show in the browser? 有关如何使websocket错误无法在浏览器中显示的任何想法?

What i've learnd so far is: you cant :0( 到目前为止我所学到的是:你不能:0(

... because this is somewhat browser specific behavior... ...因为这是某种特定于浏览器的行为......

  • so the only thing you can do is using callbacks on ws object and pray ... 所以你唯一能做的就是在ws对象上使用回调并祈祷......
  • OR just overwrite console.log ;0) 或者只是覆盖console.log ; 0)

with the code i did however i got rid of some error messages, maybe it'll help ;) 用我做的代码然而我摆脱了一些错误消息,也许它会帮助;)

eg: 例如:

  • Chrome won't complain about dead servers and silently try to reconnect.. Chrome不会抱怨死机,并默默尝试重新连接..
  • IE 11 still gives script error IE 11仍然会出现脚本错误
  • etc.. 等等..

A Basic Class to wrap WS : Have a look at callbacks ! 包装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;
};

});

Have a look at the Connect() : onError(), onClose() function 看看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;
};
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM