#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, когда эта вещь обнаруживается сервером ввода-вывода сокетов. Вы должны хранить информацию о том, кто с кем разговаривает, и использовать это как список пользователей, которые должны быть проинформированы об изменении состояния.