Предполагая, что вы уже настроили socketio и экспресс-сервер должным образом с механизмом сохранения пути к файлу и имени файла в вашей базе данных.
Попробуйте что-то вроде этого (с socketio)
let sockets = [];
io.on("connection", function(socket) {
socket.on("online", data => {
socket.name = data.username;
sockets[data.username] = socket.id;
});
socket.on("send_file", function(data) {
// your logic to retrieve the file path from you database in to the variable **filedata**
// let filedata = ................
socket.to(sockets[data.user]).emit("file",filedata);
});
socket.on("disconnect", reason => {
sockets.splice(sockets.findIndex(id => id === socket.id), 1);
});
});
в событии send_file вы получите имя пользователя от отправителя внутри объекта данных.Следующий код поможет вам отправить файл выбранному пользователю.
socket.to (sockets [data.user]). Emit ("file", filedata);
Ответ на ваш 1-й комментарий .
history.push () не обновит клиент, поскольку он является одностраничным приложением.Но когда вы обновляете (со стороны пользователя A ) новый сеанс сокета, то другой пользователь (пользователь B ) все еще будет ссылаться на старый сеанс сокета (который ужеотключен обновлением).Поэтому, чтобы справиться с этим, используйте следующие строки
socket.on("online", data => {
socket.name = data.username;
sockets[data.username] = socket.id;
});
, где вы будете хранить пул (массив) sockets
с именами пользователей, поэтому, когда пользователь обновляет свой клиент, вновь созданный сокет будет ссылатьсятому же пользователю.Так как вы будете обновлять socket.id тому же человеку.Например, предположим, что вы пользователь, который обновляет клиента, а я другой пользователь.поэтому при обновлении будет создан новый сеанс сокета, и он будет отправлен на сервер вместе с именем пользователя.Когда данные поступают на сервер, он получает ваш объект сеанса из массива ( сокеты [data.username] ) и обновляет его новым сокетом, отправленным из вашего внешнего сокетов [данных.username] = socket.id; .
, чтобы это произошло, вам нужно будет отправить имя пользователя вместе с сообщением сокета.вот так
socket.emit("online", {
username: "username"
});
Ответ на ваш второй комментарий Для отправки данных в режиме реального времени пользователи должны быть онлайн.если нет, вы можете просто создать массив уведомлений со следующей информацией (отправитель и получатель).Поэтому, когда получатель входит в систему или щелкает на панели уведомлений, может отображаться список уведомлений об общих файлах.Это всего лишь предположение, что вы можете придумать свою собственную идею.Надеюсь, это поможет.