Est-ce que je peux rattraper l'erreur "ne peut pas établir une connexion" pour une connexion Websocket défaillante?

Je dois tester si la connexion à mon serveur Web est établie ou non.

À ce moment, je peux me connecter au serveur, mais je souhaite pouvoir saisir la possibilité que ce serveur ne soit pas accessible, donc cette question est sur ce qu'il faut faire lorsque la connexion Web ne peut pas être établie ou quand elle est épuisée.

En utilisant simplement le code Web basique dans Firefox, il expirera en environ 20 secondes et appellera mon gestionnaire d'erreur. Mais il va également lancer une erreur JavaScript qui (au moins pour moi utilisant Firebug) s'affiche dans le navigateur. Le journal affiche alors:

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

Ce que j'ai essayé jusqu'à présent:

  • Empêchez le délai de 20 secondes en ajoutant ma propre window.timeout qui vérifie si le gestionnaire onopen a été appelé pour l'instant ou non, mais cela n'empêche pas l'erreur JavaScript.
  • Force-ferme le websocket à la fin de mon timeout, mais maintenant, j'ai deux erreurs JavaScript: le plus original:

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

  • Ajouter try {} catch(e) {} à mon code, à la fois lors de la connexion du socket et de la fermeture – pas de changement.

Des idées sur la façon d'obtenir des erreurs de websocket pour ne pas apparaître dans le navigateur?

Ce que j'ai appris jusqu'ici est: vous ne pouvez pas: 0 (

… car il s'agit d'un comportement quelque peu spécifique au navigateur …

  • Alors la seule chose que vous pouvez faire est d'utiliser les rappels sur l'objet ws et de prier …
  • OU simplement écraser console.log ; 0)

Avec le code que j'ai fait, je me suis débarrassé de certains messages d'erreur, peut-être que cela aidera;)

par exemple:

  • Chrome ne se plaindra pas des serveurs morts et tentera silencieusement de se reconnecter ..
  • IE 11 donne toujours une erreur de script
  • etc..

Une classe de base pour envelopper WS: Regardez les rappels!

 /** * 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; }; }); 

Jetez un oeil à la fonction 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; }; });