Node.js:socket.ioclosures客户端连接
如何closures客户端的套接字连接?
我在用:
- socket.io 0.9
- node.js 0.10.15
- expression3.3.4
即:调用localhost/test
– 服务器端
var test = io .of('/test') .on('connection', function (socket) { console.log('open socket: ' + socket); socket.on('disconnect', function () { console.log('disconnected event'); //socket.manager.onClientDisconnect(socket.id); --> endless loop with this disconnect event on server side //socket.disconnect(); --> same here }); });
– 客户端
var socket = io.connect('http://localhost:3000/test'); socket.on('disconnect', function () { console.log('disconnect client event....'); }); socket.emit('getInitData', function (data) { .. do something with data });
如果我加载testing页,我需要从服务器(getInitData)的一些值。
在第一页访问我得到的数据一次,在重新加载或第二次访问我得到它两次,等等。
服务器端的连接在页面重新加载时自动closures,如果离开页面。
但是在客户端,连接仍然是打开的。
如何closures客户端的连接或检查是否已经打开连接?
UPDATE
我现在尝试以下:(客户端)
window.onbeforeunload = function(e) { socket.disconnect(); };
这在客户端触发断开连接事件,但我仍然得到两次或tripple响应。
服务器端和/或浏览器端没有连接。 只有一个连接。 如果其中一方closures它,则closures(并且不能将数据推送到明显closures的连接)。
现在浏览器在离开页面时closures连接(不依赖于服务器端使用的库/语言/操作系统)。 这对于WebSockets来说至less是正确的(对于长时间轮询来说,这可能不是真的,因为keep-alive
但是keep-alive
socket.io能正确处理这个问题)。
如果发生这样的问题,那么我很确定你自己的代码有错误(在服务器端)。 可能你正在堆叠一些事件处理程序,你不应该这样做。
你试过了吗:
socket.disconnect()
在客户端?
对于socket.io版本1.4.5:
在服务器上:
socket.on('end', function (){ socket.disconnect(0); });
在客户端:
var io = io(); io.emit('end');
socket.disconnect()
只在客户端重新启动连接触发断开连接事件。 但是再次连接。
socket.close()
断开与客户端的连接。 客户端将继续尝试连接。
我试图closures1.0版的用户连接,并发现这种方法:
socket.conn.close()
这个方法和disconnect()之间的区别在于客户端将不断尝试重新连接到服务器。
试试这个closures连接:
socket.close();
如果你想再次打开它:
socket.connect();
只需在服务器端通过从客户端发出任何事件来尝试socket.disconnect(true)
。