如何将用户名从php会话存储到nodejs中的socket.io库和页面刷新时套接字连接断开。为啥?

Posted

技术标签:

【中文标题】如何将用户名从php会话存储到nodejs中的socket.io库和页面刷新时套接字连接断开。为啥?【英文标题】:How to store usernames from php session to socket.io library in nodejs and socket connection disconnects on page refresh.Why?如何将用户名从php会话存储到nodejs中的socket.io库和页面刷新时套接字连接断开。为什么? 【发布时间】:2017-05-02 06:18:08 【问题描述】:

我正在为我的网络工作门户制作一个聊天应用程序。我曾经将用户名从 php 会话保存到 nodejs 套接字 io 库..我很困惑..可以在套接字对象中存储 10k 个用户。如果是,那么如何维护该用户列表?另一个问题是当用户从一个页面导航到另一个页面时..socket 断开连接并再次连接..它会影响我的应用程序性能或 nodejs 服务器的性能吗?

请通过教程或博客指导我..我还没有找到有关套接字连接管理的相关文档..提前谢谢!

【问题讨论】:

当用户导航到不同的页面时,客户端会自动关闭任何套接字。这是一种正常行为(“这是一项功能”)。 如何解决这个问题..在用户关闭浏览器然后断开连接之前,有什么方法可以处理套接字连接? 【参考方案1】:

您可以将数据存储到socket。 例如,

在服务器端,像这样使用,

    var socketIo = require('/socket.io').listen(8080);
    var usernames=[];    

    socketIo.sockets.on('connection', function (socket)     
        socket.on('storeUserData', function (data)   
           var userInfo = new Object();
           userInfo.userName = data.userName;
           userInfo.SocketId = socket.id;
            usernames.push(userInfo);
        );    

        socket.on('disconnect', function (data) 
         var len = usernames.length;

            for(var i=0; i<len; i++)
                var user = usernames[i];

                if(user.socketId == socket.id)
                    usernames.splice(i,1);
                    break;
                
                
        );
    );

在客户端,你需要添加这个

<script>
    var userName = <?php echo $_SESSION['userName'] ?>;        
    var socket = io.connect('http://localhost', port: 8080);    
    socket.on('connect', function (data) 
        socket.emit('storeUserData',  'userName' : userName );
    );
</script>

刷新页面时套接字连接断开。为什么?

这是socket.io 的默认行为。

【讨论】:

可以为我的门户网站同时在 javascript 数组中存储 10k 用户名吗?有时它会给出最大堆栈超额错误? @GouravRathore;如果您有巨大的存储需求,您可以在后端使用数据库。即使你可以使用Redis 感谢您的好意...您能给我任何redis示例来存储用户数据或任何类型的教程或博客来阅读和理解..我是使用redis的新手.. .提前致谢!

以上是关于如何将用户名从php会话存储到nodejs中的socket.io库和页面刷新时套接字连接断开。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS express - 如何在路由器内添加会话数据?

如何将 POST 数据发送到 PHP 中的另一个会话?

使用 NodeJS,如何使用 Spring Security OAuth2 制作的 JWT 检索存储在 PostgreSQL 中的会话信息?

如何根据 PHP 中的会话数据将用户重定向到不同的页面?

nodejs / express中的数据库会话支持[关闭]

如何将 PHP 用户详细信息(会话)解析到 Node.js 服务器?