套接字向特定用户发出

时间:2017-07-11 10:38:07

标签: sockets express

我在同一主题上发现了几个问题,没有一个主题适合我。我想这是因为我在这个过程中遗漏了一些东西:

我想向特定用户发送消息。 我用:

#include <ctype.h>

void url_decode(char *dst, const char *src) {
    unsigned char a, b;
    while (*src) {
        if (*src == '%'
        &&  isxdigit(a = tolower((unsigned char)src[1]))
        &&  isxdigit(b = tolower((unsigned char)src[2]))) {
            a -= isdigit(a) ? '0' : 'a';
            b -= isdigit(b) ? '0' : 'a';
            *dst++ = 16 * a + b;
            src += 3;
        } else
        if (*src == '+') {
            *dst++ = ' ';
            src++;
        } else {
            *dst++ = *src++;
        }
    }
    *dst = '\0';
}

这是我的代码:

服务器(如您所见,我使用mongoose来处理会话):

"express": "^4.13.3"
"socket.io": "^1.3.7"
"socket.io-client": "^1.3.7"
"mongodb": "^2.2.2"
"mongoose": "^4.5.4"

然后是socketRouter函数。我使用mongo dataStore存储用户配置文件的socketId,以使用户使用emit。

const io = new SocketIo(server);

io.use(socketioJwt.authorize({
  secret: configSocket.secret,
  handshake: true
}));

// persistence store of our session
const MongoStore = mongoStoreFactory(session);

const sessionMiddleware = session({
  store: new MongoStore({
    mongooseConnection: mongoose.connection,
    ttl: (1 * 60 * 60) // 1 hour
  }),
  secret: configSocket.secretSession,
  httpOnly: true,
  resave: false,
  saveUninitialized: false,
  // rolling: true,
  // secure: true,
  cookie: { maxAge: 86400000 }
});
app.use(sessionMiddleware);

...

socketRouter(io);

&#39; forceNotif&#39;调用的函数。在这里,我期待不同的行为。我希望socket将值发送给特定用户(与发送请求的用户不同)。我从MongoDb中检索socketId,确切地说。然后我想用它来达到我的目的。在网上提出了几个不同的命题。我测试了以下内容:

exports = module.exports = (io) => {
  io.sockets.on('connection', (socket) => {
    Users.findById(socket.decoded_token.sub, (err, user) => {
      if (user) {
        // if the user exists, save the socket Id in the user collection
        Users.update({_id: user._id}, {$set: {socketId: socket.id}}, (err2, result) => {

          // ------ PROTECTED ROUTES ------ //

          // MOBILE CALLS
          ...

          // DASHBOARD CALLS
          socket.on('forceNotif', (data) => Notif.force(data, io, socket));

          // ------------------------------ //
        });
      }
    });
    socket.on('disconnect', ()=> {
      Users.update({_id: socket.decoded_token.sub}, {$set: {socketId: null}});
    });
  });

我希望有人可以帮助我: - )

1 个答案:

答案 0 :(得分:1)

所以我找到了解决方案: 套接字documentation比&#34;每个套接字自动加入由id&#34;标识的房间。但由于某些原因,我仍然不明白,当我以下列方式发布(使用mongoDb存储,检索和检查socketId)时,没有任何反应:

socket.broadcast.to(socketId).emit('blabla', msg);

但最后我通过以下方式手动将用户加入个人房间:

  io.on('connection', (socket) => {
    Users.findById(socket.decoded_token.sub, (err, user) => {
      if (user) {
        // create a room for every user
        socket.join(user._id);

        socket.on('exemple', (data) => functionExemple(data, io));
        ...

然后我可以像这样向functionExemple中的特定用户发出(其中targetId是集合中用户的_id):

exports.functionExemple= (par, io) => {
  returnEmit.to(targetId).emit('blabla', msg);
};

我希望它会对某人有所帮助: - )