通过外部触发将数据推送到Web套接字

时间:2017-09-01 08:27:59

标签: javascript web websocket socket.io

我想在调用rest api时将数据推送到所有连接的套接字

我有一个基于快速的节点js应用程序。

在应用程序启动时,我创建了文档中提到的套接字服务器。

客户代码

var socket = io('http://localhost');
socket.emit('client_id', 'test');
socket.on('message', function (message) {
    console.log(message);
});

服务器代码

io.on('connection', function (socket) {
    socket.on('client_id', function (client_id) {
        socket.join(client_id);
    });
});

API致电

io.sockets.to('client_name').emit('message', 'Some message');  

问题是,当我启动节点/套接字服务器并启动客户端时,这很好用。

但是当我重新启动节点/套接字服务器时,客户端不再收到该消息。我将不得不重新加载客户端以开始接收消息。

可能是什么问题

2 个答案:

答案 0 :(得分:2)

就问题commented而言,我将尝试解释您提供的代码究竟发生了什么。另外,我想为您提出your comment

的解决方案
// With the following line of code you connect to the server
var socket = io('http://localhost');

// Now you send the client_id and it is sent only once per page load
socket.emit('client_id', 'test');

// And here subscribe to the message event
socket.on('message', function (message) {
    console.log(message);
});

// ----------------------------------------
// now we change the above code like

var socket = io('http://localhost'); 
socket.on('connect', function(){
    // emit the event client_id every time you connect
    socket.emit('client_id', 'test');   
    socket.on('message', function (message) {
        console.log(message);
    }); 
});

您需要将代码包装在on('connect', ...)订阅中,以确保每次连接到服务器client_id时都会发送。否则client_id仅在加载客户端代码时发送一次。

如果您想避免your comment中所述的双重消息,您可以更新服务器端代码,如:

// Save reference to client_id by socket.id
var clientIds = {};
io.on('connection', function (socket) {

    socket.on('client_id', function (client_id) {
        clientIds[socket.id] = client_id;
        socket.join(client_id);
    });

    // Subscribe to disconnect event and leave the room once client is disconnected
    socket.on('disconnect', function (reason) {
        // leave the room
        socket.leave(clientIds[socket.id]);
    });

});

使用上面的代码,确保在客户端断开连接后离开房间。

如果有什么不清楚,请告诉我。祝你好运!

答案 1 :(得分:-2)

每个网络连接都有一些与之关联的状态,重启服务器时很可能会丢失该状态。实现超时并重新连接到服务器是一种可能的解决方案。