【发布时间】:2019-07-05 15:49:20
【问题描述】:
我正在使用 socket.IO 在 NodeJS 和 Android 中构建一个测验应用程序,
当我从服务器发出事件quizzoStatus 时遇到问题,该事件第一次触发一次,第二次触发两次,依此类推。
这里附上我的代码sn-p
///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代码
/// Android code
socket.emit("sendQuizzoAnsPoints", new Gson().toJson(quizzoStatusRequestDto));
socket.on("quizzoStatus", new Emitter.Listener(){
@Override
public void call(Object... args){
runOnUiThread(new Runnable(){
@Override
public void run(){
Log.e("opponet point", opponentPoints + " " + quizzoStatusResponseDto.getPoints());
}
});
}
});
【问题讨论】:
-
似乎您的客户端(android)多次连接到服务器
-
我已经查过了,客户端连接了一次,但同时有两个或多个客户端从不同的设备连接。
-
每台设备都连接同一个ID?
-
不,每台设备都使用不同的 ID 连接。 @ŞivāSankĂr
-
服务器重启后记录所有连接的设备(ID)。只需将
console.log()放在socket.join()之前即可
标签: java android node.js websocket socket.io