简体   繁体   中英

working chat example which use session to authenticate users socket.io express node.js

is there any working example which store sessions and use that sessions for all opened windows to let one user just connect to one room just once?

this app will get phpsessions as node.js sessions but i cant findout how to just let one person to access this chat application just once

//define what we need
    var express = require('express'),
        app = express(),
        memcache = require("memcache"),
        http = require('http'),
        server = http.createServer(app),
        io = require('socket.io').listen(server),
        co = require("./cookie.js"),
        php = require('phpjs'),
        codein = require("node-codein");


    // answer all request from users and send them back index.html for root access
    app.get('/', function (req, res) {
      res.sendfile(__dirname + '/index.html');
      var cookieManager = new co.cookie(req.headers.cookie);

      //using memcache as our session store
      var client = new memcache.Client(11211, "localhost");
      //connect to memcache client
      client.connect();
      //get our cookie sessions
        user = client.get("sessions/"+cookieManager.get("sec_session_id"), function(error, result){
                var session = JSON.parse(result);
                            //get just username from sessions(sessions store name and family and chat username in this case)
                user = JSON.parse(session.name);
                user = user.username;
                            //use this function to pass our chat username to our function
                storeUsername(user);
        });

    });

    function storeUsername(user){
    // usernames which are currently connected to the chat

    var usernames = {};
    io.sockets.on('connection', function (socket) {
        usernames[socket.id] = socket;
        // when the client emits 'sendchat', this listens and executes
        socket.on('sendchat', function (data) {
            // we tell the client to execute 'updatechat' with 2 parameters
            io.sockets.emit('updatechat', socket.username, data);
        });

        // when the client emits 'adduser', this listens and executes
        socket.on('adduser', function(username){
            // we store the username in the socket session for this client
            socket.username = user;
            // add the client's username to the global list
            // echo to client they've connected
            if(php.in_array(socket.username,usernames)){
                delete usernames[socket.username];
            }else{
                usernames[user] = user;
                console.log('not exist');
            socket.emit('updatechat', 'SERVER', 'you have connected');
            // echo globally (all clients) that a person has connected
            socket.broadcast.emit('updatechat', 'SERVER', username + ' has connected');
            // update the list of users in chat, client-side
            io.sockets.emit('updateusers', usernames);
            }
        });

        // when the user disconnects.. perform this
        socket.on('disconnect', function(){
            // remove the username from global usernames list
            delete usernames[socket.username];
            // update list of users in chat, client-side
            io.sockets.emit('updateusers', usernames);
            // echo globally that this client has left
            socket.broadcast.emit('updatechat', 'SERVER', socket.username + ' has disconnected');
        });
    });
    }
    server.listen(3000);

everything works fine and user which send data is defined but when i access this site in another tab i will connect another time to socket.io server

Do you mean sharing a websocket between browser tabs?

Sharing websocket across browser tabs?

But why do you need to share sockets? I've developed a node.js chat for a forum and we don't care about how many sockets a user has. We just have a "User" object that has a list of sockets. We don't care if the sockets come from firefox, from an android app... it's not a problem. And when we need to send information to a user, we send it to each socket.

You can try this. It is using express and socket.io https://github.com/gravityonmars/Balloons.IO

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM