1

I'm writing a social web with NodeJS, Express and Angular.

Now I already handled socket between server and client but I want to send a server side status of a user to only his friends, not broadcast to the whole network.

This is my code:

In client

Main.js

angular.module('appServices', ['ngResource']).
factory('socket', function($rootScope){
    var socket = io.connect();
    return {
        on: function (eventName, callback){
            socket.on(eventName, function(){
                var args = arguments;
                $rootScope.$apply(function(){
                    callback.apply(socket, args);
                });
            });
        },
        emit: function (eventName,data, callback){
            socket.emit(eventName, data, function (){
                var agrs = arguments;
                $rootScope.$apply(function (){
                    if(callback){
                        callback.apply(socket, agrs);
                    }
                });
            })
        }
    };
});

Controller.js

function activityCtrl($scope, socket){   
$scope.createStatus = function(){
    var sttData = $scope.stt;       
    socket.emit('createStt',sttData);
}
socket.on('addStt',function(data){
    $scope.user.activity.unshift(data);
});
socket.on('myStt',function(data){
    $scope.user.activity.unshift(data);
});

}

Main.js

angular.module('webProfileApp',['appServices'])// appServices duoc goi tu services.js
.config(['$routeProvider', function($routeProvider){
    $routeProvider.
        when('/activity/:userId',{ templateUrl: 'partials/me.html', controller: activityCtrl });
}]);

In Serverside:

app.js

var express = require('express');
var routes = require('./routes');
var user = require('./routes/user');
var http = require('http');
var path = require('path');

var app = express();
var server = http.createServer(app);
var io = require('socket.io').listen(server);

io.sockets.on('connection',user.createStt);

User.js

exports.createStt = function(socket){
socket.on('createStt',function(dataSocket){
    console.log('Save status---------');
    var reqBody = dataSocket;
    //
    //Save data 
    //
    socket.broadcast.emit('addStt',reqBody);
    socket.emit('myStt',reqBody);

        });
    });
Mathias Müller
  • 22,203
  • 13
  • 58
  • 75
  • have you tried http://stackoverflow.com/questions/4647348/send-message-to-specific-client-with-socket-io-and-node-js ? – Daiwei Dec 26 '13 at 18:08

1 Answers1

0

I use a variant of rooms with a special GUID...

SERVER

  var on_connected = function(sockets, socket, user) {
    socket.join(token(special_room_name));
  }

//...

  sockets.in(token(special_room_name)).emit('special_event_name', {...});

CLIENT

socket.on('special_event_name', function(info) {
  $scope.users = info;
});

Note: client only receives this if we called join() on his socket, i.e. she is a memebr of this room...

malix
  • 3,566
  • 1
  • 31
  • 41