gpt4 book ai didi

javascript - 我可以捕获 "can' t establish a connection"失败的 websocket 连接错误吗?

转载 作者:可可西里 更新时间:2023-11-01 01:42:57 25 4
gpt4 key购买 nike

我需要测试是否已建立与我的 websocket 服务器的连接。

此时,我可以连接到服务器,但我希望能够捕捉到该服务器不可达的可能性,所以这个问题是关于当websocket连接无法建立或超时时该怎么办出。

仅使用 Firefox 中的基本 websocket 代码,它将在大约 20 秒后超时并调用我的错误处理程序。但它也会抛出一个 JavaScript 错误(至少对我使用 Firebug 而言)出现在浏览器中。然后日志显示:

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

到目前为止我尝试了什么:

  • 通过添加我自己的 window.timeout 来防止 20 秒超时,它会检查 onopen 处理程序是否已被调用,但这并不能防止 JavaScript 错误.
  • 在我自己的超时结束时强行关闭 websocket,但现在我得到了两个 JavaScript 错误 - 原来的加上:

    与 ws://192.168.0.1/的连接在页面加载时中断。

  • 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;
};
});

关于javascript - 我可以捕获 "can' t establish a connection"失败的 websocket 连接错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22919638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com