我该如何使用socket.io向一个客户端发出消息(而不是每个人)

时间:2019-01-01 23:46:11

标签: javascript socket.io

仔细阅读文档,但没有运气。我正在尝试向单个客户端/用户而不是每个用户发送邮件。

我阅读了有关此问题的其他几个问题,大多数问题都没有答案或指向较旧的解决方案。任何帮助将不胜感激。

以下内容有效,但发给网站上的所有人,而不是单个用户...

服务器:

//Socket.io
const http = require('http').Server(app);
const io = require('socket.io')(http);

app.post('/login', (req, res) => {
    const email = cryptonize.encrypt(req.body.email);
    const password = cryptonize.encrypt(req.body.password);
    io.emit('login success', email, password);
});

客户:

const socket = io();
socket.on('login success', (user, token, auth) => {
    console.log(`user:${user}, password:${password});
});

我已经尝试过socket.io备忘单中提到的“ socket.emit”,但是它在服务器上以未定义的形式返回。可能我真的很想念一些简单的东西,只是没看到它。

2 个答案:

答案 0 :(得分:3)

我不认为这是socket.io的预期用途。

对于您来说,一个简单的res.end(...)即可(至少根据您向我们展示的内容)。

app.post('/login', (req, res) => {
    const email = cryptonize.encrypt(req.body.email);
    const password = cryptonize.encrypt(req.body.password);
    res.end(/* data */);
});

阅读关于res.end()的{​​{3}}。

如果您确实需要发射到单个插座,则需要做更多的工作:

  1. 使用docs
  2. 获取socket.io's rooms or namespace
  3. 使用套接字ID发射。

下面是使用默认名称空间的示例:

服务器

const IO = require('socket.io');
const io = IO(server);

// Default namespace is '/'
const namespacedIO = io.of('/');

io.on('connection', socket => {
    socket.on('send', data => {
        const targetSocket = namespacedIO.connected[data.socketID];
        targetSocket.emit('received', data.value);
    });
});

客户

const socket = io();

submit.addEventListener('click', function(){
    socket.emit('send', {
        socketID: socket.id,  // IMPORTANT: to get the source socket ID
        value: input.value
    });
})

socket.on('received', function(data){
    console.log(`Data "${data}" is received at server.'`);
});

答案 1 :(得分:2)

这就是我最后要做的,对于其他试图弄清楚这一点的人。

服务器:

//Socket.io
const http = require('http').Server(app);
const io = require('socket.io')(http);

app.post('/login', (req, res) => {
    const email = cryptonize.encrypt(req.body.email);
    const password = cryptonize.encrypt(req.body.password);
    const socketid = req.query.socket;

    io.sockets.connected[socketid].emit('login success', email, password);
});

客户:

const socket = io();
let socketid;
socket.on('connect', () =>  socketid = socket.io.engine.id);

客户续..
然后,我在帖子生成时为其添加了一个“ socketid”查询。

//XHR Setup
const xhr = new XMLHttpRequest();
let response, status, readyState;
xhr.onreadystatechange = () => {
    if (xhr.status === 200 && xhr.readyState === 4) response = xhr.response;
};

//XHR POST
const post = ({ url, callback, data }) => {
    xhr.open('POST', `${url}&socketid=${socketid}`, true), xhr.setRequestHeader('Content-type', 'application/json'), xhr.send(data);
    if (callback) callback();     
    console.log(`${url}&socketid=${socketid}`);   
}