После повторного подключения к моему серверу socket.io не получает событие, отправленное с моего устройства android - PullRequest
0 голосов
/ 02 августа 2020

Я правда не вижу, что не так, На телефоне android подключаюсь к своему серверу node 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", {});
    });
}

Надеюсь, мой вопрос ясен. Спасибо всем, кто мне поможет.

1 Ответ

1 голос
/ 02 августа 2020

Попробуйте следующее:

off событие при отключении сокета и on при каждом подключении

socket.off("toast");

РЕДАКТИРОВАТЬ: вместо выключения используйте removeAllListeners:

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