Отправка сообщения пользователю, который не подключен?

#node.js #socket.io

#node.js #socket.io

Вопрос:

Я пытаюсь создать приложение для общения пользователей — без группового чата или чего-либо еще. Я использую NodeJS и Socket.io на серверной части, и React Native на интерфейсе.

В итоге у меня был a Map , который хранит a user id , и он соответствует socket id , моя проблема в том, что только когда пользователь подключается к серверу, он получит идентификатор сокета. Но что, если пользователь A подключен и пытается отправить сообщение пользователю B, а пользователь B не подключен, поэтому у него нет идентификатора сокета, я действительно не знаю, что тогда делать.

Это то, что я получил до сих пор:

 io.on("connection", (socket: Socket) => {
  //Whenever a user will connect, the user will emit 'initiate' to register itself and it's socket id to the server.
  //We will be using this userSocketMap to send messages between users.
  socket.on(SocketEvents.INITIATE, (data) => {
    const uid = data.uid;
    const socketID = socket.id;

    userSocketMap.set(uid, socketID);
  });

  //This function will get called when a user is sending message to another user.
  socket.on(SocketEvents.SEND, (data) => {
    const to = data.to;
    const from = data.from;
    const content = data.content;

    const payload: MessagePayload = {
      to: to,
      from: from,
      content: content,
    };

    const dstUser = userSocketMap.get(to); // getting the socket id of the receiver.

    // '/#' is the prefix for the socketID, if the socketID already has this prefix, this should be deleted - need to check this.
    //MessageEvent.RECEIVE is used to signal the dstUser to receive a message.
    io.to("/#"   dstUser).emit(SocketEvents.RECEIVE, { payload: payload });
  });

  socket.on(SocketEvents.DISCONNECT, (socket: Socket) => {
    const userID = getByValue(socket.id);
    if (!userID) return;

    userSocketMap.delete(userID);
  });
});
  

Ответ №1:

Вы должны делать две вещи при работе с react-native и socket.ввод-вывод в случае, если пользователь потерял подключение к Интернету. Используйте сокет.механизм сердцебиения ввода-вывода для получения пользователей, которые потеряли соединение и не отвечают, и пользовательский пакет NetInfo для информирования мобильного пользователя о том, что он потерял подключение к Интернету.

Socket.io

 var server = app.listen(80);
var io = socketio(server,{'pingInterval': 2000});

io.on("connection", (socket: Socket) => {
    socket.on(SocketEvents.INITIATE, (data) => {
        const uid = data.uid;
        const socketID = socket.id;

        userSocketMap.set(uid, socketID);
    })

    socket.on('heartbeat', (socket: Socket) => {
        const userID = getByValue(socket.id)
        userSocketMap.MARK_USER_AS_INACTIVE(userID)
   })

});
  

React-Native — используйте NetInfo — раньше он был частью ядра, но был выделен в модуль сообщества

 import NetInfo from "@react-native-community/netinfo";

NetInfo.fetch().then(state => {
    console.log("Connection type", state.type);
    console.log("Is connected?", state.isConnected);
});

const unsubscribe = NetInfo.addEventListener(state => {
    console.log("Connection type", state.type);
    console.log("Is connected?", state.isConnected);
});

// Unsubscribe
unsubscribe();
  

Комментарии:

1. Спасибо, я не знал об этом, и я буду работать над этим. Но это не то, что я имел в виду под своим вопросом. Я имел в виду, допустим, пользователь B сейчас не использует приложение (он же отключен / отключен), а пользователь A хочет отправить пользователю B сообщение, как мне с этим справиться? Извините, если моя формулировка была неясной.

2. В этом случае вы должны передать информацию о «проблеме с подключением» пользователя UserA, когда эта вещь обнаруживается сервером ввода-вывода сокетов. Вы должны хранить информацию о том, кто с кем разговаривает, и использовать это как список пользователей, которые должны быть проинформированы об изменении состояния.