Могу ли я поймать ошибку "не могу установить соединение" для неудачного соединения через веб-сокет?

Мне нужно проверить, установлено ли соединение с моим сервером веб-сокетов или нет.

В настоящее время я МОГУ подключиться к серверу, но я хочу быть в состоянии уловить возможность того, что этот сервер недоступен, поэтому вопрос состоит в том, что делать, если не удается установить соединение через веб-сокет или когда оно истекло.

Используя только базовый код веб-сокета в Firefox, он отключится примерно через 20 секунд и вызовет мой обработчик ошибок. Но это также выдаст ошибку JavaScript, которая (по крайней мере, для меня, использующая Firebug) появляется в браузере. Журнал затем показывает:

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

Что я пробовал до сих пор:

  • Предотвратить 20 секундный тайм-аут, добавив мой собственный window.timeout который проверяет, если onopen Обработчик был вызван или нет, но это не предотвращает ошибку JavaScript.
  • Принудительно закройте веб-сокет в конце моего времени ожидания, но теперь я получаю ДВА ошибки JavaScript - оригинальный плюс:

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

  • Добавление try {} catch(e) {} к моему коду, как при подключении сокета, так и при его закрытии - без изменений.

Любые идеи о том, как получить ошибки веб-сокета, чтобы не показывать в браузере?

2 ответа

Решение

То, что я узнал до сих пор: вы не можете: 0 (

... потому что это поведение браузера

  • так что единственное, что вы можете сделать, это использовать обратные вызовы для объекта ws и молиться...
  • ИЛИ просто перезаписать console.log;0)

с кодом, который я сделал, однако я избавился от некоторых сообщений об ошибках, может быть, это поможет;)

например:

  • Chrome не будет жаловаться на мертвые серверы и молча попытаться восстановить соединение.
  • IE 11 по-прежнему выдает ошибку скрипта
  • так далее..

Базовый класс для переноса 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;
};
});

Попробуйте что-нибудь подобное:

      function send_data(url,data) {
  var json_text = JSON.stringify(data);
  var socket = new WebSocket(url);
  socket.addEventListener("open", (event) => {
    socket.send(json_text);
  })
  socket.addEventListener("message", handle_message);
  socket.addEventListener("error", () => setTimeout(send_data, 2000, url, data));
}

Он пытается переподключиться каждые 2 секунды.

(Я знаю, что этот вопрос старый, я нашел его во время отладки этой проблемы и подумал, что мои выводы могут быть полезны другим.)

Другие вопросы по тегам