Отправить сообщение с сервера клиенту с помощью dnode

Пару месяцев назад я открыл для себя nowjs и dnode и, наконец, использовал nowjs (и https://github.com/Flotype/nowclient) для двунаправленной связи клиент/сервер.

nowclient обеспечивает связь nowjs между процессами 2 узлов (вместо между процессом узла и браузером для nowjs из коробки). Затем я смог отправлять данные с клиента на сервер и с сервера на клиент. Теперь я использую узел 0.6.12, и использовать узел 0.4.x для запуска клиента довольно болезненно.

Я внимательно изучаю dnode и не очень понимаю, как работает связь между сервером и клиентом. Возможно ли, что сервер отправляет прямое сообщение клиенту? Идея состоит в том, чтобы клиент регистрировался на сервере (при первом подключении) и позволял серверу связываться с клиентом, когда это необходимо.

Насколько я понимаю, вызов метода на сервере возможен, если клиент сначала запросил что-то с сервера. Это правильно ?


person Luc    schedule 05.05.2012    source источник


Ответы (1)


dnode использует симметричный протокол, поэтому любая сторона может определять функции, которые может вызывать противоположная сторона. Есть 2 основных подхода, которые вы можете использовать.

Первый способ — определить функцию регистрации на стороне сервера и передать обратный вызов от клиента.

сервер:

var dnode = require('dnode');

dnode(function (remote, conn) {
    this.register = function (cb) {
        // now just call `cb` whenever you like!
        // you can call cb() with whichever arguments you like,
        // including other callbacks!

        setTimeout(function () {
            cb(55);
        }, 1337);
    };
}).listen(5000)

клиент:

var dnode = require('dnode');

dnode.connect('localhost', 5000, function (remote, conn) {
    remote.register(function (x) {
        console.log('the server called me back with x=' + x);
    });
});

или вместо этого вы можете напрямую вызывать клиента с сервера симметричным образом после завершения обмена методами:

сервер:

var dnode = require('dnode');

dnode(function (remote, conn) {
    conn.on('ready', function () {
        remote.foo(55);
    });
}).listen(5000);

клиент:

var dnode = require('dnode');
dnode(function (remote, conn) {
    this.foo = function (n) {
        console.log('the server called me back with n=' + n);
    };
}).connect('localhost', 5000);
person substack    schedule 08.05.2012
comment
Спасибо за ваши разъяснения. Может ли клиент подключиться к серверу и ждать входящего звонка с сервера? Кроме того, есть ли идентификатор клиента, который может использоваться на стороне сервера? - person Luc; 09.05.2012
comment
Я использовал conn.id и remote для отслеживания клиентов. Это работает действительно здорово. - person Luc; 09.05.2012
comment
Только что понял, что этот ответ взят из подстека самого себя. ‹3 dat guy — столько классных модулей! - person MiniGod; 20.06.2013
comment
Да он качается! Я пытаюсь понять, как заставить это работать с потоком udp, но события происходят после начальной загрузки. Кажется, что все примеры предназначены для связи, которая происходит при первой загрузке (d.on()). Кто-нибудь из вас знает, как это сделать для последующих событий? - person wayofthefuture; 03.09.2016