【问题标题】:Correctly capture an error Socket.io正确捕获错误Socket.io
【发布时间】:2014-12-09 18:01:06
【问题描述】:

我正在构建一个简单的聊天。 我正在使用 websocket lib socket.io,因为它具有出色的服务器/客户端实现。

我的客户端在移动设备上,因此网络连接非常不稳定。 我已经阅读了一些关于可以通过发射传递的确认函数,以便在套接字“事务”完成后执行代码。但在此基础上构建错误处理将非常难看。

我还阅读了关于捕获错误的 .on('error' 实现。

这里的问题是:如何在未成功发送的消息 (.emit) 和暂时丢失的套接字连接之间分开。我不在乎丢失套接字连接,因为我将它设置为一旦丢失就重新连接。

我希望我的情况得到澄清。提前致谢。

编辑:

我在客户端寻找的是这样的东西:

socket.on('error', function(data){
   alert(data.emitData.msg+' could not be sent: '+data.emitID);
});

与此同时,我将开始亲自仔细研究 API

【问题讨论】:

    标签: javascript websocket socket.io


    【解决方案1】:

    消息确认覆盖here in the socket.io docs。这是该文档的相关部分:

    有时,您可能希望在客户确认后收到回调 消息接收。

    为此,只需将函数作为 .send 的最后一个参数传递或 。发射。更重要的是,当你使用 .emit 时,确认是由 你,这意味着你也可以传递数据:

    服务器(app.js)

    var io = require('socket.io').listen(80);
    
    io.sockets.on('connection', function (socket) {
      socket.on('ferret', function (name, fn) {
        fn('woot');
      });
    });
    

    客户端(index.html)

    <script>
      var socket = io(); // TIP: io() with no args does auto-discovery
      socket.on('connect', function () { // TIP: you can avoid listening on `connect` and listen on events directly too!
        socket.emit('ferret', 'tobi', function (data) {
          console.log(data); // data will be 'woot'
        });
      });
    </script>
    

    还有,这里显示的另一个示例:Acknowledgment for socket.io custom event

    【讨论】:

    • 感谢您更详细地解释确认 - 但您认为这如何帮助我找出实际上没有传递到服务器的消息。没有连接到服务器 = 没有确认 cb
    • @MaxBumaye - 我描述的是确认确认。如果数据包没有送达,你会在 websocket 上得到一个错误,你可以通过监听 error 消息来监听错误。 TCP 是一种可靠的协议,因此您要么得到确认,要么得到错误——其中之一。
    • 哦,好吧,我是否理解正确,我实际上不需要确认函数来做任何事情?
    • 传递一个空的确认函数,如果它没有被调用就会发出“错误”?
    • @MaxBumaye - 如果您只想要错误,那么只需收听error 消息并进行处理。如果您不想要确认,则不需要确认功能。无论哪种方式,该协议都是可靠的。它要么将消息传递到服务器,要么给你一个错误。
    猜你喜欢
    • 1970-01-01
    • 2021-07-26
    • 2012-12-12
    • 1970-01-01
    • 2023-04-07
    • 2020-04-17
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    相关资源
    最近更新 更多