socket.ioサーバーに再接続した後、androidデバイスから送信されたイベントを受信しません

2020-08-02 javascript android node.js websocket socket.io

何が問題なのか本当にわかりません。Androidフォンでサーバーノードjs socket.ioに接続すると、すべてのイベントが機能しました。しかし、接続を切断して再アクティブ化した場合。再接続はサーバーによって検出されます。ただし、電話からサーバーに送信されたイベントはサーバーで受信されません。

私は再接続を可能にするパラメータを持つソケットを作成しました:

private Socket socket;
{
    try {
        IO.Options opts = new IO.Options();
        opts.forceNew = false;
        opts.reconnection = true;
        opts.reconnectionAttempts = Integer.MAX_VALUE;
        opts.reconnectionDelay = 1000;
        opts.reconnectionDelayMax = 5000;
        socket = IO.socket(Constant.URL_SOCKET, opts);
    } catch (URISyntaxException e) {
        e.printStackTrace();
    }
}

明らかに、onCreateを呼び出すことを忘れていませんでした。

socket.connect();
actionSocket();

ここで私のリスタナーもonCreateを呼び出します:

    socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            actionSocket();
        }
    });
    socket.on(Socket.EVENT_RECONNECT, new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            actionSocket();
        }
    });

actionSocketはこの関数に対応します。

 socket.on("toast", new Emitter.Listener() {
        @Override
        public void call(Object... args) {
             runOnUiThread(new Runnable() {
                 @Override
                 public void run() {
                    Toast.makeText(MainActivity.this, "Toast", Toast.LENGTH_SHORT).show();
                 }
             });
        }
    });

テスト再接続のために、私はこのボタンを手に入れました:

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        socket.emit("toast", new JSONObject());
    }
});

サーバ側 :

io.on('connection', function(socket){
    console.log("connection");
    addSocketListeners(socket);
});

そしてaddSocketListeners()

function addSocketListeners(socket){
    socket.on("toast", function(data){
         socket.emit("toast", {});
    });
}

私の質問が明確であることを願っています。私を助けてくれるみんなに感謝します。

Answers

これを試して:

ソケットを切断するときにイベントをoff 、毎回接続するときにonにする

socket.off("toast");

編集:オフの代わりにremoveAllListenersを使用します:

io.on('connection', function(socket){
    socket.on("disconnect", function(){
        socket.removeAllListeners("toast");
    });
});

Related