Java 套接字IO事件多次触发NodeJS
我正在NodeJS和Android中使用socket.IO构建一个测验应用程序 当我从服务器发出一个事件quizzoStatus时,我面临一个问题,该事件第一次激发一次,第二次激发两次,以此类推 这里我附上我的代码片段Java 套接字IO事件多次触发NodeJS,java,android,node.js,websocket,socket.io,Java,Android,Node.js,Websocket,Socket.io,我正在NodeJS和Android中使用socket.IO构建一个测验应用程序 当我从服务器发出一个事件quizzoStatus时,我面临一个问题,该事件第一次激发一次,第二次激发两次,以此类推 这里我附上我的代码片段 ///server side: NodeJS socket.on('sendQuizzoAnsPoints', async (data)=>{ try { const obj = JSON.parse(data);
///server side: NodeJS
socket.on('sendQuizzoAnsPoints', async (data)=>{
try {
const obj = JSON.parse(data);
const game = await QuizzoPlayModel.findOne({_id:obj.gameId});
const player = await UserModel.findOne({_id: game.playerId});
const opponent = await UserModel.findOne({_id: game.opponentId});
if(obj.userId == game.opponentId){
let update = {
opponentPoints: game.opponentPoints + obj.points || 0,
opponentWA: game.opponentWA + obj.wrongAns || 0,
};
await QuizzoPlayModel.findByIdAndUpdate(obj.gameId, update).lean().exec();
userNamespace.to(player.socketId).emit('quizzoStatus', {
fullName: opponent.fullName,
points: game.playerPoints + obj.points,
wrongAns: obj.wrongAns,
gameId: obj.gameId
});
}
if(obj.userId == game.playerId) {
let update = {
playerPoints: game.playerPoints + obj.points || 0,
playerWA: game.playerWA + obj.wrongAns || 0,
};
await QuizzoPlayModel.findByIdAndUpdate(obj.gameId, update).lean().exec();
userNamespace.to(opponent.socketId).emit('quizzoStatus', {
fullName: player.fullName,
points: game.playerPoints+ obj.points,
wrongAns: obj.wrongAns,
gameId: obj.gameId
});
}
} catch (e) {
console.log(e);
}
});
在这里,我听一个名为sendQuizzoAnsPoints的事件,然后在另一个名为quizzoStatus的事件中向玩家或对手发射一个事件
quizzoStatus事件从服务器多次触发到android。
这里我附加了android代码
问题在于安卓系统。您每次都在分配新的侦听器,而不删除前一个侦听器。您需要为该Emmiter侦听器创建一个变量,并在onDestroy上或工作完成时将其删除:
//variable of Emmiter.Listener
Emmiter.Listener quizzoStatus = new Emitter.Listener(){
@Override public void call(Object... args){
runOnUiThread(new Runnable(){
@Override public void run(){
Log.e("opponet point", opponentPoints + " " + quizzoStatusResponseDto.getPoints());
}
});
}
};
//assigning the listener
socket.on("quizzoStatus", quizzoStatus);
. . . .
@Override protected void onDestroy(){
super.onDestroy();
//removing the listener...
socket.off("quizzoStatus", quizzoStatus);
}
希望这能起作用似乎您的客户端android多次连接到服务器我已经检查过了,客户端连接了一次,但同时,有两个或多个客户端从不同的设备连接。每个设备都使用相同的ID连接?否,使用不同ID连接的每个设备。@ŞivĂrLog服务器重启后所有连接的设备ID。只需将console.log放在socket.join之前
//variable of Emmiter.Listener
Emmiter.Listener quizzoStatus = new Emitter.Listener(){
@Override public void call(Object... args){
runOnUiThread(new Runnable(){
@Override public void run(){
Log.e("opponet point", opponentPoints + " " + quizzoStatusResponseDto.getPoints());
}
});
}
};
//assigning the listener
socket.on("quizzoStatus", quizzoStatus);
. . . .
@Override protected void onDestroy(){
super.onDestroy();
//removing the listener...
socket.off("quizzoStatus", quizzoStatus);
}