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

后端 未结 1 847
北荒
北荒 2021-01-01 19:21

I need to test if the connection to my websocket server is established or not.

At this time, I CAN connect to the server, but I want to be able to catch the possibil

相关标签:
1条回答
  • 2021-01-01 19:43

    What i've learnd so far is: you cant :0(

    ... because this is somewhat browser specific behavior...

    • so the only thing you can do is using callbacks on ws object and pray ...
    • OR just overwrite console.log ;0)

    with the code i did however i got rid of some error messages, maybe it'll help ;)

    e.g:

    • Chrome won't complain about dead servers and silently try to reconnect..
    • IE 11 still gives script error
    • etc..

    A Basic Class to wrap WS : Have a look at callbacks !

    /**
     * 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

    /**
     * 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;
    };
    });
    
    0 讨论(0)
提交回复
热议问题