nodejs纯websocket交付状态

时间:2015-02-26 01:14:25

标签: node.js networking tcp websocket

我正在使用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 gist的片段:https://gist.github.com/SKART1/b0635f07d1b5799880d7

1 个答案:

答案 0 :(得分:0)

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

您永远不会调用您指定的回调函数,除非您幸运地为该时间戳准确地设置了一个eventListener。 语法可以是

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

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