Rag*_*aer 78 javascript disconnect socket.io
无法处理此断开事件,不知道为什么socket不发送给客户端/客户端没有响应!
服务器
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;
});
});
Run Code Online (Sandbox Code Playgroud)
客户
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);
});
});
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,当客户端断开连接时,应该删除数组对象[person_name],但不是
cod*_*aff 157
好的,而不是通过名称跟踪识别他们已连接的套接字的玩家.你可以有类似的实现
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);
});
});
Run Code Online (Sandbox Code Playgroud)
希望这会帮助你以另一种方式思考
T J*_*T J 18
对于像@ sha1这样的人想知道为什么OP的代码不起作用 -
OP在服务器端删除播放器的逻辑在DelPlayer事件的处理程序中,发出此事件(DelPlayer)的代码在disconnected客户端的内部事件回调中.
发出此disconnected事件的服务器端代码位于disconnect事件回调中,当套接字失去连接时会触发该回调.由于套接字已经丢失连接,因此disconnected事件无法到达客户端.
接受的解决方案disconnect在服务器端执行事件上的逻辑,当套接字断开连接时触发,因此有效.
创建一个 Map 或一个 Set,并使用“on connection”事件设置给每个连接的套接字,相反的“一旦断开”事件从我们之前创建的 Map 中删除该套接字
import * as Server from 'socket.io';
const io = Server();
io.listen(3000);
const connections = new Set();
io.on('connection', function (s) {
connections.add(s);
s.once('disconnect', function () {
connections.delete(s);
});
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
145951 次 |
| 最近记录: |