簡體   English   中英

對於失敗的websocket連接,我可以捕獲“無法建立連接”錯誤嗎?

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

我需要測試是否建立了與websocket服務器的連接。

這時,我可以連接到服務器,但我希望能夠捕獲該服務器無法訪問的可能性,所以這個問題是關於無法建立websocket連接或超時時該怎么辦。

僅使用Firefox中的基本websocket代碼,它將在大約20秒內超時並調用我的錯誤處理程序。 但它也會拋出一個JavaScript錯誤(至少對我來說使用Firebug)會出現在瀏覽器中。 然后日志顯示:

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

到目前為止我嘗試過的:

  • 加入我自己的防止20秒超時window.timeout來檢查,如果在onopen處理程序被調用但還是不行,但這並不妨礙JavaScript錯誤。
  • 在我自己的超時結束時強制關閉websocket,但現在我得到兩個JavaScript錯誤 - 原來的加號:

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

  • try {} catch(e) {}到我的代碼中,無論是在連接套接字還是關閉它時 - 都沒有變化。

有關如何使websocket錯誤無法在瀏覽器中顯示的任何想法?

到目前為止我所學到的是:你不能: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;
};
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM