我想在调用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');
问题是,当我启动节点/套接字服务器并启动客户端时,这很好用。
但是当我重新启动节点/套接字服务器时,客户端不再收到该消息。我将不得不重新加载客户端以开始接收消息。
可能是什么问题
答案 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)
每个网络连接都有一些与之关联的状态,重启服务器时很可能会丢失该状态。实现超时并重新连接到服务器是一种可能的解决方案。