我正在为node.js https://npmjs.org/package/ws
使用这个简单的WebSockets实现想知道默认情况下服务器上的vars是用户还是服务器特定的?我无法理解许多用户和一个服务器...节点现在看起来像薛定谔的猫(它既是,也不是)
如果我设置了服务器:
var thing=(thing>0)?thing:0;
console.log('thing='+thing+' this only seems to happen when the server born, hmm ok...');
//Normal require/set up ws stuff...
wss.on('connection',function(ws){
thing=Math.floor(Math.random()*101);
ws.on('message',function(_){
ws.send('reply: thing='+thing);
});
});
客户:
ws=new WebSocket('ws://'+somehost+':'+(someport));
ws.onopen=function(){
ws.onmessage=function(_){console.log(_.data);}
ws.send('question: what is the thing now?');
}
$('#button').click(function(){ws.send('question: what is the thing now?');});
现在如果我有两个用户(A& B)一个接一个地进入网站:
用户A将打开该页面,并将var视为第一个随机数
用户B将其视为第二个随机数
A可以点击按钮,然后将其视为第二个随机数
如果B点击按钮B,也会看到第二个随机数
...因为B在服务器上为每个人改变了它?
我这样做了吗?在服务器上创建一个特定于连接的变量,而客户端没有(零)有用信息?
如果我不清楚我想要做的是A总是看到它设置的数字而B总是看到它设置的数字。
服务器可以知道差异吗?
是否只是放置代码的问题? (如示例所示,仅在服务器出生时显示控制台日志)
或者它可能类似于Javascript复制对象与引用对象之间的区别吗?
答案 0 :(得分:0)
每次有人连接时,全局thing
变量都会重新随机化。该变量只有一个实例。
如果您想要每个用户变量,请使用对象字典。
var things = {}
然后在连接上你可以做
things[unique_user_id] = // whatever
我认为在该连接对象ws
中的某处,应该有一个可以使用的唯一标识符。
答案 1 :(得分:0)
这取决于您放置var
关键字的位置。您现在拥有它的范围超出了在新连接上执行的功能,因此您在每个连接之间共享一个thing
。
如果您将var
关键字移动到您的函数中,请执行以下操作:
var thing = Math.floor(Math.random()*101);
然后thing
将是该函数的上下文的本地,这意味着将有两个单独的thing
s(每个连接一个),因为每个新连接都会执行一次函数。