node-cluster-socket.io icon indicating copy to clipboard operation
node-cluster-socket.io copied to clipboard

simple put socket on your sample

Open pishguy opened this issue 7 years ago • 0 comments

Hi i'm implementing simple socket by your code, but from android i cant check login

my login function and socket work fine without using Cluster, could you help me?

var express   = require('express'),
    cluster   = require('cluster'),
    net       = require('net'),
    sio       = require('socket.io'),
    mysql     = require('mysql'),
    sio_redis = require('socket.io-redis');

var port          = 3000,
    num_processes = require('os').cpus().length;

var connection = mysql.createConnection(
    {
        host              : 'localhost',
        user              : 'root',
        password          : 'a',
        database          : 'shoot',
        multipleStatements: true
    });

if (cluster.isMaster) {
    var workers = [];

    var spawn = function (i) {
        workers[i] = cluster.fork();

        workers[i].on('exit', function (worker, code, signal) {
            console.log('respawning worker', i);
            spawn(i);
        });
    };

    // Spawn workers.
    for (var i = 0; i < num_processes; i++) {
        spawn(i);
    }
    var worker_index = function (ip, len) {
        var s = '';
        for (var i = 0, _len = ip.length; i < _len; i++) {
            if (!isNaN(ip[i])) {
                s += ip[i];
            }
        }

        return Number(s) % len;
    };

    var server = net.createServer({pauseOnConnect: true}, function (connection) {
        var worker = workers[worker_index(connection.remoteAddress, num_processes)];
        worker.send('sticky-session:connection', connection);
    }).listen(port);
} else {
    // Note we don't use a port here because the master listens on it for us.
    var app = new express();

    // Here you might use middleware, attach routes, etc.

    // Don't expose our internal server to the outside.
    var server = app.listen(0, 'localhost'),
        io     = sio(server);

    io.adapter(sio_redis({host: 'localhost', port: 6379}));
    process.on('message', function (message, connection) {
        if (message !== 'sticky-session:connection') {
            return;
        }

        server.emit('connection', connection);

        connection.resume();
    });

    io.on('login', function (data) {
        login(data.username, data.password, function (success, value) {
            if (success)
                redisClient.set(data.username, socket.id);
            socket.emit('login', {result: success, id: value});
        });
    });

}

function login(username, password, callback) {
    var query = "SELECT * FROM users WHERE username = ?";
    connection.query(query, [username], function (err, results) {
        if (err) return callback(false);
        if (results.length === 0) return callback(false);
        var user = results[0];

        if (!bcrypt.compareSync(password, user.password)) {
            return callback(false);
        }

        callback(true, {
            id: user.id.toString(),
        });
    });
}

pishguy avatar Aug 06 '16 08:08 pishguy