[英]Reconnect socket with nodeJS
關於重新連接 nodejs,我需要你的幫助。
事實上,我正在開發一個使用 socket.io 的 web 應用程序,我想知道當與 .network 或服務器斷開連接時如何將播放器重新連接到同一個套接字。
我不能在這里發布我的代碼,但這段代碼與我的非常相似:
//When a connection to server is made from client
io.on('connection', (socket) => {
//When host connects for the first time
socket.on('host-join', (data) =>{
//Check to see if id passed in url corresponds to id of kahoot game in database
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("kahootDB");
var query = { id: parseInt(data.id)};
dbo.collection('kahootGames').find(query).toArray(function(err, result){
if(err) throw err;
//A kahoot was found with the id passed in url
if(result[0] !== undefined){
var gamePin = Math.floor(Math.random()*90000) + 10000; //new pin for game
games.addGame(gamePin, socket.id, false, {playersAnswered: 0, questionLive: false, gameid: data.id, question: 1}); //Creates a game with pin and host id
var game = games.getGame(socket.id); //Gets the game data
socket.join(game.pin);//The host is joining a room based on the pin
console.log('Game Created with pin:', game.pin);
//Sending game pin to host so they can display it for players to join
socket.emit('showGamePin', {
pin: game.pin
});
}else{
socket.emit('noGameFound');
}
db.close();
});
});
});
//When the host connects from the game view
socket.on('host-join-game', (data) => {
var oldHostId = data.id;
var game = games.getGame(oldHostId);//Gets game with old host id
if(game){
game.hostId = socket.id;//Changes the game host id to new host id
socket.join(game.pin);
var playerData = players.getPlayers(oldHostId);//Gets player in game
for(var i = 0; i < Object.keys(players.players).length; i++){
if(players.players[i].hostId == oldHostId){
players.players[i].hostId = socket.id;
}
}
var gameid = game.gameData['gameid'];
MongoClient.connect(url, function(err, db){
if (err) throw err;
var dbo = db.db('kahootDB');
var query = { id: parseInt(gameid)};
dbo.collection("kahootGames").find(query).toArray(function(err, res) {
if (err) throw err;
var question = res[0].questions[0].question;
var answer1 = res[0].questions[0].answers[0];
var answer2 = res[0].questions[0].answers[1];
var answer3 = res[0].questions[0].answers[2];
var answer4 = res[0].questions[0].answers[3];
var correctAnswer = res[0].questions[0].correct;
socket.emit('gameQuestions', {
q1: question,
a1: answer1,
a2: answer2,
a3: answer3,
a4: answer4,
correct: correctAnswer,
playersInGame: playerData.length
});
db.close();
});
});
io.to(game.pin).emit('gameStartedPlayer');
game.gameData.questionLive = true;
}else{
socket.emit('noGameFound');//No game was found, redirect user
}
});
//When player connects for the first time
socket.on('player-join', (params) => {
var gameFound = false; //If a game is found with pin provided by player
//For each game in the Games class
for(var i = 0; i < games.games.length; i++){
//If the pin is equal to one of the game's pin
if(params.pin == games.games[i].pin){
console.log('Player connected to game');
var hostId = games.games[i].hostId; //Get the id of host of game
players.addPlayer(hostId, socket.id, params.name, {score: 0, answer: 0}); //add player to game
socket.join(params.pin); //Player is joining room based on pin
var playersInGame = players.getPlayers(hostId); //Getting all players in game
io.to(params.pin).emit('updatePlayerLobby', playersInGame);//Sending host player data to display
gameFound = true; //Game has been found
}
}
//If the game has not been found
if(gameFound == false){
socket.emit('noGameFound'); //Player is sent back to 'join' page because game was not found with pin
}
});
//When the player connects from game view
socket.on('player-join-game', (data) => {
var player = players.getPlayer(data.id);
if(player){
var game = games.getGame(player.hostId);
socket.join(game.pin);
player.playerId = socket.id;//Update player id with socket id
var playerData = players.getPlayers(game.hostId);
socket.emit('playerGameData', playerData);
}else{
socket.emit('noGameFound');//No player found
}
});
//When a host or player leaves the site
socket.on('disconnect', () => {
var game = games.getGame(socket.id); //Finding game with socket.id
//If a game hosted by that id is found, the socket disconnected is a host
if(game){
//Checking to see if host was disconnected or was sent to game view
if(game.gameLive == false){
games.removeGame(socket.id);//Remove the game from games class
console.log('Game ended with pin:', game.pin);
var playersToRemove = players.getPlayers(game.hostId); //Getting all players in the game
//For each player in the game
for(var i = 0; i < playersToRemove.length; i++){
players.removePlayer(playersToRemove[i].playerId); //Removing each player from player class
}
io.to(game.pin).emit('hostDisconnect'); //Send player back to 'join' screen
socket.leave(game.pin); //Socket is leaving room
}
}else{
//No game has been found, so it is a player socket that has disconnected
var player = players.getPlayer(socket.id); //Getting player with socket.id
//If a player has been found with that id
if(player){
var hostId = player.hostId;//Gets id of host of the game
var game = games.getGame(hostId);//Gets game data with hostId
var pin = game.pin;//Gets the pin of the game
if(game.gameLive == false){
players.removePlayer(socket.id);//Removes player from players class
var playersInGame = players.getPlayers(hostId);//Gets remaining players in game
io.to(pin).emit('updatePlayerLobby', playersInGame);//Sends data to host to update screen
socket.leave(pin); //Player is leaving the room
}
}
}
});
因此,使用此代碼,我如何實施重新連接解決方案。
非常感謝
你可以給每個玩家一個 ID onconnect(這不是套接字 ID)。 您將此 ID 保存在數組/對象(服務器和/或客戶端)中,如果他斷開連接,您將他留在聚會/會話中。 如果他重新連接,你會再次把他放進去。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.