【问题标题】:How to avoid create a new socket connection in socket.io after html page refresh?html页面刷新后如何避免在socket.io中创建新的套接字连接?
【发布时间】:2012-03-20 16:38:37
【问题描述】:

我试过socket.io,我发现当客户端html页面加载时,创建了一个新的socket连接。当我刷新页面时,我发现创建了一个新的socket连接,然后旧的连接断开了。

我的问题是如何避免这种情况?因为我正在构建一个聊天室应用程序。当用户进入房间页面时,在“连接”服务端发出“欢迎用户 xxx 来!”,在“断开连接”事件上发出“用户 xxx 离开”。但是当用户刷新当前页面时,这将触发 'disconnect' 事件并再次触发 'connected' 事件。它会发出“欢迎用户xxx来!”和“用户 xxx 已离开”。一起发消息。

如何忽略页面刷新事件?和http会话一样?


更新:我已经找到解决问题的方法。从这个问题Handle browser reload socket.io

【问题讨论】:

标签: node.js real-time socket.io


【解决方案1】:

你不能阻止刷新页面,也没有办法避免用户刷新页面时socket.io断开。

我建议添加一个超时:

  • 当看到用户断开连接时,启动一个计时器,例如 10-30 秒
  • 如果用户在计时器尚未结束时返回聊天,请不要执行任何操作
  • 如果定时器结束后用户没有返回,则显示“用户已离开”消息

【讨论】:

  • 这个问题有“类似会话”的解决方案吗?
  • 我真的不明白你的意思..客户端的套接字在浏览器中,当重新加载页面时,该页面的所有客户端JS代码和状态基本上都被丢弃.
  • 你能给这个伪代码吗?我有点迷茫
【解决方案2】:

您可以使用会话。即使在刷新时套接字断开连接,您仍然可以保留该特定用户的一些数据,并在套接字再次连接时使用这些数据。

以下是您使用会话的方式:

var express = require('express');     
var MemoryStore = require('express').session.MemoryStore;

app.use(express.cookieParser());
app.use(express.session({ secret: "keyboard cat", store: new MemoryStore({ reapInterval: 60000 * 10 })}));

app.get('/', function(req,res){
    req.session.name ="clients_name";
    res.render(__dirname + '/index.jade',{user:req.session.name});
});

你应该使用jade或任何其他“查看引擎”来获取传递给页面的数据。

【讨论】:

    猜你喜欢
    • 2015-11-02
    • 2018-02-15
    • 2017-06-14
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 2023-03-13
    • 2017-03-21
    相关资源
    最近更新 更多