0

当用户关闭浏览器选项卡时,我需要通过 socket.io 向 nodejs 服务器发送数据。

我试着做:

var data={};
window.onbeforeunload = function() {
// i have a object to be sent 
data.data1='abcd';
data.data2=1234;
socket.emit("senddata",data);
}

此代码在用户点击网站上的链接进行导航时有效,但在用户关闭浏览器选项卡时无效

我还尝试在服务器端配置套接字 io,如下所示.. 认为错误可能是由于套接字连接在发出数据之前被关闭:

var io = require('socket.io').listen(app.listen(port));
io.configure(function () {
io.set('close timeout',12000);
});

它也没有工作的大部分时间。

我也在客户端试过这个:

var socket = require('socket.io').listen(80, {
"sync disconnect on unload":false
});

它也没有工作

我曾尝试接收这样的数据

var io = require('socket.io').listen(app.listen(port));

io.sockets.on('connection', function (socket) {

socket.on('senddata', function (data) {
// data processing
});
});

请..帮我解决这个问题..提前谢谢..

4

1 回答 1

2

当用户连接时 - 在服务器端注册它发生的时间。
Socket.IO 具有心跳和 ping 功能。因此,只需在服务器端订阅disconnect事件,一旦它发生 - 意味着客户端已断开连接 - 当客户端有连接时,您就拥有服务器时间。这样你就有了客户会话的时间跨度。

不要相信客户端会告诉您任何时间或重要数据,因为客户端可以简单地“撒谎” - 这会导致您的服务器端出现黑客/作弊/错误。

根本没有可靠的方法在与客户端断开连接之前发送数据。Socket.IO 中没有任何内容,也只有一种传输方式(WebSockets)。还有太多不同的断开连接情况(断电、强制关闭、以太网电缆断开、wifi 丢失等)。

于 2013-09-11T12:50:40.377 回答