2014-01-27 3 views
1

Я использую эту простую реализацию WebSockets для node.js https://npmjs.org/package/wsНепонятно о node.js; одна переменная для всех?

Удивление, если по умолчанию на сервере есть пользователь или сервер по умолчанию ...? Я не могу получить мою голову вокруг многих пользователей и один сервер ... узел, кажется, как кошка Шредингера прямо сейчас (это и есть, и это не так)

Если настроить сервер:

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), которые идут на сайт один за другим:

  • пользователь А открывает страницу и увидеть вар как 1-го случайного числа

  • пользователь B будет видеть его как второе случайное число

  • может нажать на кнопку, то увидеть его в качестве второго случайного числа

  • если B нажал кнопку B будет также увидеть второе случайное число

... Потому что B изменил его на сервере для всех?

Я делаю это правильно? Сделать переменную на сервере, которая становится специфичной для подключения без нулевой информации от клиента?

Если я не понимаю, что я хотел бы сделать, так это то, что А всегда видит номер, который он устанавливает, а Б всегда видит номер, который он устанавливает.

Может ли сервер знать разницу?

Речь идет только о том, где разместить код? (например, пример показывает журнал консоли только при рождении серверов)

Или это может быть похоже на разницу между Javascript-копированием объекта и ссылкой на объект?

ответ

0

Это зависит от того, где вы размещаете ключевое слово var.Теперь, когда у вас есть это, область выходит за пределы функции, выполняемой при новом подключении, поэтому у вас есть один thing, используемый для каждого подключения.

При перемещении var ключевого слова в вашу функцию следующим образом:

var thing = Math.floor(Math.random()*101); 

Тогда thing будет локальным в контекст этой функции, которая означает, что будет два отдельные thing s (один для каждого соединения), так как функция выполняется один раз для каждого нового соединения.

+0

WOW вы просто сделали это для меня так мало слов! теперь ДВА одной и той же вещи: D –

+0

@ BENZ.404 Добро пожаловать. Я рад, что смогу помочь. – Paulpro

0

Переменная global thing перераспределяется при каждом подключении. Есть только один экземпляр этой переменной.

Если вы хотите переменные для каждого пользователя, используйте объект dict.

var things = {} 

А потом на связи вы можете сделать

things[unique_user_id] = // whatever 

Я думаю, что где-то в этом объекте связи, ws, должен быть уникальный идентификатор, который вы можете использовать.

+0

, но как же сервер знает, какая часть объекта вам при следующем нажатии? Если номер раста определил номер, почему клиент должен сообщить серверу, что это за номер? –

+1

@ BENZ.404: Э? Пока соединение остается открытым, идентификатор не изменится. Клиенту не нужно знать, что это такое. Идентификатор доступен для всей функции wss.on ('connection', function (ws) {'scope. Вы можете использовать ее внутри бит .on ('message'' тоже. – mpen

+1

Я не использовал' ws', поэтому я не уверен на 100%, если он предоставит вам этот идентификатор, но если нет, вы можете сгенерировать GUID внутри функции on-connection (не забывая использовать ключевое слово 'var' внутри *), и вы все будет в порядке. Или просто просто сохраните все, что вам нужно прямо там (как предлагает Paulpro), и вам даже не нужно беспокоиться об этом. Это просто зависит от того, где вам нужно получить доступ к var, а иногда с глобальным объектом полезно, если вам нужно получить доступ к пользовательским данным из других областей или узнать, сколько пользователей подключено (не забудьте удалить при отключении). – mpen

Смежные вопросы