mezzanine.ak
mezzanine.ak

Reputation: 53

Sails.js + socket.io: Sending messages from server to clients

I'm attempting to set up a system with sails.js to have the server broadcast messages to a set of clients. Basically:

  1. A client in Group A sends an AJAX request to the server.
  2. The server processes the request and sends a message through socket to all clients of Group B.
  3. The clients of Group B receive the message through the socket and display something.

According to the socket.io documentation, I should be able to have the clients in Group B join a "room", and then have the server broadcast to that specific room, but on the client side, the preexisting "socket" doesn't have the method "socket.join('room')". So, I tried just sending a unique event to all clients:

socket.on("connect", function(){
  console.log("Client Connected");
});

socket.on("my_event", function(data){
  console.log("my_event received");
});

This works fine by doing "sails.io.sockets.emit("my_event", {...})" on the server side, but isn't this sending the event to every single client? I could make the event name unique, something like "my_event_000" with an ID to specify the group, but that would still be sending events to every client unnecessarily.

Should I be using "rooms"? And if so, how?

Upvotes: 5

Views: 12000

Answers (1)

sgress454
sgress454

Reputation: 24948

The Sails way to do this would be to have a model backing your "Groups", and in a controller action have a socket subscribe to a group with Group.subscribe(groupId, req.socket). Then you can send messages to a specific group with Group.publish(groupId, data).

You can also subscribe to an arbitrary room name in a controller using req.listen(groupId), and broadcast to that room with req.broadcast(roomName, data).

This is all in the Sails documentation for working with Sockets!

Upvotes: 4

Related Questions