我正在使用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
答案 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
};
但是,请记住丢弃数据包的巨大默认超时时间。