Socket.IO处理断开事件

不能处理这个断开事件,不知道为什么套接字它不发送到客户端/客户端不响应!

服务器

io.sockets.on('connection', function (socket) { socket.on('NewPlayer', function(data1) { online = online + 1; console.log('Online players : ' + online); console.log('New player connected : ' + data1); Players[data1] = data1; console.log(Players); }); socket.on('DelPlayer', function(data) { delete Players[data]; console.log(Players); console.log('Adios' + data); }); socket.on('disconnect', function () { socket.emit('disconnected'); online = online - 1; }); }); 

客户

  var socket = io.connect('http://localhost'); socket.on('connect', function () { person_name = prompt("Welcome. Please enter your name"); socket.emit('NewPlayer', person_name); socket.on('disconnected', function() { socket.emit('DelPlayer', person_name); }); }); 

正如你所看到的,当一个客户端断开时,Array对象[person_name]应该被删除,但不是

好的,而不是通过名称跟踪与他们已经连接的sockets识别玩家。 你可以有一个像

服务器

 var allClients = []; io.sockets.on('connection', function(socket) { allClients.push(socket); socket.on('disconnect', function() { console.log('Got disconnect!'); var i = allClients.indexOf(socket); allClients.splice(i, 1); }); }); 

希望这会帮助你以另一种方式思考

对于那些像@ sha1想知道为什么OP的代码不工作 –

OP在服务器端删除播放器的逻辑在DelPlayer事件的处理程序中,发出此事件的代码( DelPlayer )在客户端的内部disconnected事件callback中。

发出此disconnected事件的服务器端代码位于disconnect事件callback中,当套接字丢失连接时会触发此事件。 由于套接字已经失去连接, disconnected事件不会到达客户端。


接受的解决scheme在服务器端执行disconnect事件的逻辑,当套接字断开时触发,从而工作。