我可以捕获失败的 websocket 连接的“无法建立连接”错误吗?

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

本文关键字:连接 建立 错误 失败 websocket 我可以      更新时间:2023-09-26

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

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

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

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

到目前为止我尝试过:

  • 通过添加我自己的window.timeout来检查是否已调用onopen处理程序来防止 20 秒超时,但这并不能防止 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;
};
});

试试这种事情:

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 秒重新连接一次。

(我知道这个问题很老了,我在调试这个问题时发现了它,并认为其他人可能会从我的结论中受益。