我试图在Node.js中使用Socket.IO,并试图让服务器为每个Socket.IO客户端提供一个标识.由于套接字代码超出了http服务器代码的范围,因此它无法轻松访问发送的请求信息,因此我假设它需要在连接期间发送.什么是最好的方法
1)通过Socket.IO获取有关谁连接的信息
2)验证他们说自己是谁(我目前正在使用Express,如果这让事情变得更容易)
如何与Socket.io 1.0和Express 4.x共享会话?我使用Redis商店,但我认为这无关紧要.我知道我必须使用中间件来查看cookie和获取会话,但不知道如何.我搜索但找不到任何工作
var RedisStore = connectRedis(expressSession);
var session = expressSession({
store: new RedisStore({
client: redisClient
}),
secret: mysecret,
saveUninitialized: true,
resave: true
});
app.use(session);
io.use(function(socket, next) {
var handshake = socket.handshake;
if (handshake.headers.cookie) {
var str = handshake.headers.cookie;
next();
} else {
next(new Error('Missing Cookies'));
}
});
Run Code Online (Sandbox Code Playgroud) 我有一些socket.io的问题,我不知道如何解决它.我有一个带有socket.io的登录系统的应用程序来管理用户交互.我还有一个数组来管理所有活动的websocket会话.此数组存储一对session.id => username.
当用户打开具有相同页面的新选项卡(或使用websocket的不同页面)时,问题就开始了.这会导致数组中的用户名条目重复.
{id1, username}
{id2, username}
Run Code Online (Sandbox Code Playgroud)
当套接字向用户发送消息时,它仅发送到该阵列的第一个会话ID,因此只有一个选项卡接收该消息.
我试图更改新连接的套接字ID以匹配另一个,但它不起作用.
socket.id = sessionId of the other websocket;
Run Code Online (Sandbox Code Playgroud)
我认为另一种解决方案是将消息发送到所有打开的会话,但我认为这不是最好的方法.
谢谢.
在node.js和express中,有很多示例显示如何获取会话数据.
正如您在访问第3个链接时所看到的,它是指向StackOverflow的链接.有一个很好的答案,但正如@UpTheCreek在那些评论中指出的那样,connect不再具有parseCookie方法.我也遇到过这个问题.我发现的所有教程都使用connect的parseCookie方法,现在这个方法不存在.所以我问他如何获取会话数据,他说他不知道最好的方法,所以我想我会在这里发布问题.使用express@3.0.0rc4时socket.io,和redis,我们如何获取会话数据并使用它来授权用户?我已经能够使用require('connect').utils.parseSignedCookie;,但是当我这样做时,我总是在握手时收到警告/错误,
warn - handshake error Error
Run Code Online (Sandbox Code Playgroud)
从我所读到的内容来看,听起来这并不是永久的解决方案.
好的,我session.socket.io在我的服务器上工作了.正如我所怀疑的那样,我在授权时陷入困境.我想我可能会以错误的方式解决这个问题,所以请随意纠正我.在我的Redis数据库中,我将获得用户的信息.他们第一次登录时,我想更新他们的cookie,以便它包含他们的用户信息.然后,当他们下次回到网站时,我想检查他们是否有cookie以及用户信息是否存在.如果它不存在,我想将它们发送到登录屏幕.在登录屏幕上,当用户提交信息时,它将针对Redis数据库测试该信息,如果匹配,它将使用用户信息更新cookie.我的问题是这些:
1)如何通过RedisStore更新/更改cookie?
2)看起来会话数据仅保存在cookie中.如果有人关闭了cookie,我如何在页面之间跟踪用户信息?
这是我的适用代码:
//...hiding unapplicable code...
var redis = require('socket.io/node_modules/redis');
var client = redis.createClient();
var RedisStore = require('connect-redis')(express);
var redis_store = new RedisStore();
var cookieParser = express.cookieParser('secret');
app.configure(function(){
//...hiding unapplicable code...
app.use(cookieParser);
app.use(express.session({secret: 'secret', store: redis_store}));
});
//...hiding code that starts the server and socket.io
var SessionSockets = require('session.socket.io');
var ssockets = new …Run Code Online (Sandbox Code Playgroud) 我怎样才能阻止某人干脆做
while(true){client.emit('i am spammer', true)};
Run Code Online (Sandbox Code Playgroud)
当有人有崩溃我的节点服务器的冲动时,这确实是一个问题!

我正在寻找一些帮助,找出依赖于express和socket.io的服务器上的会话.大多数情况下,目标是处理诸如将socket.io会话id与用户id配对,在重新连接时维护状态以及能够轻松地对服务器上的任何actor进行分组等事情.
很感谢任何形式的帮助.
谢谢.
我正在尝试在用户关闭页面时发送请求.我正在使用这个onbeforeunload活动.
选项卡关闭或页面刷新时会触发事件.我的活动如下:
window.onbeforeunload = function () {
$.ajax({ //jQuery
type: "POST",
url: "offline.php",
data: {
logout: 'false'
}
});
};
Run Code Online (Sandbox Code Playgroud)
offline.php(这不是完整的脚本):
...
unset($_SESSION["onpage"];
if ($_POST['logout'] == "false") {
sleep(3);
if (isset($_SESSION["onpage"]) || !empty($_SESSION["onpage"])) die();
}
...
Run Code Online (Sandbox Code Playgroud)
当用户关闭页面时,脚本会取消设置在聊天页面上的会话.三秒钟后,脚本应检查用户是否已返回但是检查onpage会话.但是,当我按下刷新按钮时会出现问题.刷新时,页面无法加载,因为三秒钟已完成.这导致我的整个系统被破坏.
我试过添加,ignore_user_abort(true);但它没有解决我的问题.有没有其他办法让这个工作?
旁注:这是聊天.当用户关闭页面时,它应该通过"用户已离开"消息通知聊天中的其他用户.这不应该在刷新时显示.当用户返回该页面时,它应该通知用户已经返回"用户已输入"消息的其他用户.
我正在尝试使用socket.io实现身份验证和会话.
经过大量的研究1,我设置了以下使用快速和快速会话.
问题是,express和socket.io连接似乎有不同的会话,因为id我得到的是不同的.
此外,浏览器中没有从我的应用程序中设置cookie(这可能是两个组件创建不同会话的原因?)
我正在使用express 4.13.3express-session 1.12.1和socket.io 1.3.7.
下面是我设置的服务器端代码:
var app = require('express')();
var server = app.listen(80);
var parser = require('body-parser');
var Session = require('express-session');
var io = require('socket.io')(server);
var game = require('./game.js');
var session = Session({
secret: 'some secret',
resave: false,
saveUninitialized: false,
cookie: {
'name': 'test',
httpOnly: false,
secure: false,
maxAge: ((60 * 1000) * 60)
}
});
app.use(parser.urlencoded({
extended: false
}));
app.use(session);
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, …Run Code Online (Sandbox Code Playgroud)