Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 套接字IO事件多次触发NodeJS_Java_Android_Node.js_Websocket_Socket.io - Fatal编程技术网

Java 套接字IO事件多次触发NodeJS

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);

我正在NodeJS和Android中使用socket.IO构建一个测验应用程序

当我从服务器发出一个事件quizzoStatus时,我面临一个问题,该事件第一次激发一次,第二次激发两次,以此类推

这里我附上我的代码片段

///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);
    }