Как отправить сообщение конкретному пользователю с помощью пакета socket_io_client flutter

#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 посмотри на пример