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)