【问题标题】:nodejs pure websocket delivery statusnodejs纯websocket投递状态
【发布时间】:2015-04-28 06:17:00
【问题描述】:

我正在使用 websocket 和 nodejs(服务器代理消息从一个客户端到另一个客户端)为移动设备编写聊天,并遇到了这样一个问题:如果连接没有正确关闭(平面模式或拔掉电缆),发送功能仍然成功并且没有发生错误(错误始终未定义):

  websocket.send(date.toISOString(), function ack(error) {
        if (error) {
           //Android push notification should be here
           log.error("Send error" + error);
        }
  });

当然在一些超时后(在我使用的实现中是 15 分钟)连接关闭,如果电缆将被插回,我将收到所有消息,但我丢失了在电缆被拔下之间发送的所有消息(飞行模式已开启)和超时事件(如果最终发生)。

所以问题是 - 是否有任何方法可以发现消息已传递/未传递,或者在发生关闭事件时因超时而获取 所有 未传递的消息? 或者至少检查 TCP 套接字是否仍然打开?因为在 C/C++ 上编写系统级别非常容易......

我使用了这个 websocket 实现:https://github.com/websockets/ws,与这个 WebSocket-Node 的结果相同

这里是 github 上的 sn-p 要点:https://gist.github.com/SKART1/b0635f07d1b5799880d7

【问题讨论】:

    标签: node.js networking tcp websocket


    【解决方案1】:

    AFAIK 您使用套接字的方式不支持回调。至少在 socket.io 实现中。阅读更多详情here

    你指定的回调函数永远不会被调用,除非你很幸运有一个恰好对应那个时间戳的事件监听器。 语法可以是

    client:
    websocket.send('eventName', function callback(error, paramFromServer){});
    
    server:
    websocket.on('eventName', function handler(callback){
        try{
           do work here...
           callback(null, result);
        }
        catch(ex){
           callback(ex.message, null);
        } 
    })
    

    或(使用一个处理程序处理所有消息,包括未命名的消息)

    client:
    websocket.send(data);
    
    server:
    websocket.onmessage = function allEventsHandler(data){
        process(data);
    };
    

    请注意,在第一种情况下,只有在服务器成功返回时才会调用回调。该参数永远不会是自动的。它应该由服务器提供。

    为了解决丢包问题,您可能希望为onerror 放置一个处理程序。

    websocket.onerror = function(event) {
      // handle error event
    };
    

    但是,请记住丢弃数据包的巨大默认超时时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      相关资源
      最近更新 更多