#node.js #flutter #socket.io #chat
#node.js #flutter #socket.io #Чат
Вопрос:
Я пытаюсь создать приложения для чата с использованием сокета.ввод-вывод и node.js для серверной части и flutter для интерфейса… до сих пор я пытался отправить сообщение всем подключенным пользователям, есть ли способ отправить сообщение конкретному пользователю? вот часть моего серверного кода
io.on('connection', (socket) =&&t; {
console.lo&(`id: ${socket.id}`)
socket.on('send_messa&e', (ms&) =&&t; {
var detail = JSON.parse(ms&)
socket.in(detail["receiver"]).emit('to_user', ms&)
})
});
во flutter я использую пакет socket_io_client (https://pub.flutter-io.cn/packa&es/socket_io_client) но я не знаю, как отправить сообщение для конкретного пользователя
вот часть кода для интерфейса
StreamController<Strin&&&t; _data = StreamController<Strin&&&t;();
socket.on('send_messa&e', (x) {
_data.sink.add(x);
});
sendChat(Strin& ms&, Strin& sender, Strin& receiver) {
Map map = {"ms&": ms&, "snd": sender, "rcv": receiver};
var mapbody = json.encode(map);
socket.emit('send_messa&e', mapbody);
}
Stream<Strin&&&t; &et sendChat =&&t; _data.stream;
Ответ №1:
у вас должен быть сокет.идентификатор и используйте io.sockets.socket (socketId).emit (ms&) для отправки сообщения
var express = require("express");
var redis = require("redis");
var sio = require("socket.io");
var client = redis.createClient()
var app = express.createServer();
var io = sio.listen(app);
io.set("store", new sio.RedisStore);
// In this example we have one master client socket
// that receives messa&es from others.
io.sockets.on('connection', function(socket) {
// Promote this socket as master
socket.on("I'm the master", function() {
// Save the socket id to Redis so that all processes can access it.
client.set("mastersocket", socket.id, function(err) {
if (err) throw err;
console.lo&("Master socket is now" socket.id);
});
});
socket.on("messa&e to master", function(ms&) {
// Fetch the socket id from Redis
client.&et("mastersocket", function(err, socketId) {
if (err) throw err;
io.sockets.socket(socketId).emit(ms&);
});
});
});
Комментарии:
1. Привет, спасибо за вашу помощь… Знаете ли вы, как внедрить
io.sockets.socket(socketId).emit(ms&)
flutter со стороны клиента?
Ответ №2:
некоторые варианты у вас есть здесь.
Первый :
вы можете сохранить идентификаторы подключенных клиентов в redis.
используйте io-redis :
и сохранить в нем свой идентификатор клиента: для хранения идентификаторов в redis:
await redisClient.lpush(`socket_members`, socket.id);
для получения определенного идентификатора:
let client = await redisClient.lran&e(
`socket_members`,
0,
socket.id
);
второй вариант — вы можете создать промежуточное программное обеспечение для аутентификации
const jwt = async(socket, next) =&&t; {
let token = socket.handshake.query.token
let verify = jwt.verify(socket.handshake.query.token, jwt_encryption, async(err, decoded) =&&t; {
// find user with decoded token
if (!user) {
return next(new Error(JSON.strin&ify({ status: 401, messa&e: 'unuthorized' })));
}
socket.user = user._doc
return next()
})
};
и использовать его в экземпляре socket io :
io.use(jwt);
аутентифицированный пользователь находится в socket.user.
надеюсь, это поможет
Комментарии:
1. Привет, спасибо за помощь, есть ли у вас какой-нибудь пример, как реализовать первый вариант на стороне клиента flutter?
2. @uyhaW посмотри на пример