Вопрос

Как они сравниваются друг с другом?

Это было полезно?

Решение

TL; DR

Dnode

  • предоставляет RMI;
  • Удаленные функции могут принимать обратные вызовы в качестве аргументов;
  • Что приятно, так как он полностью асинхронно;
  • запускает отдельный или через существующий HTTP-сервер;
  • может иметь клиентов браузера и узлов;
  • поддерживает промежуточное программное обеспечение, как connect;
  • Был уже дольше, чем сейчас.

Nowjs

  • Выходит за рамки только RMI и реализует API «общей области». Это как Dropbox, только с переменными и функциями вместо файлов;
  • удаленные функции также принять обратные вызовы (Спасибо Шридатте и Эрику от Nowjs за разъяснение);
  • Зависит от прослушивания HTTP -сервера для работы;
  • могут иметь только клиенты браузера;
  • стал публичным совсем недавно;
  • сейчас несколько глюка.

Вывод

Nowjs - это больше игрушка прямо сейчас - но следите за тем, как он созревает. Для серьезных вещей, может быть, пойти с DNODE. Для более подробного обзора этих библиотек прочитайте.

Dnode

DNODE предоставляет систему удаленного метода вызова. Как клиент, так и сервер могут разоблачить функции друг другу.

// On the server

var server = DNode(function () {
    this.echo = function (message) {
        console.log(message)
    }
}).listen(9999)

// On the client

dnode.connect(9999, function (server) {
    server.echo('Hello, world!')
})

Функция, которая передается DNode() Обработчик, не похожий на то, что перешел кhttp.createServer. Анкет У него есть два параметра: client можно использовать для доступа к функциям, экспортируемым клиентом, и connection можно использовать для обработки событий, связанных с соединением:

// On the server

var server = DNode(function (client, connection) {
    this.echo = function (message) {
        console.log(message)
        connection.on('end', function () {
            console.log('The connection %s ended.', conn.id)
        })
    }       
}).listen(9999)

Экспортируемые методы могут пройти все, включая функции. Они должным образом завернуты как прокси DNODE и могут быть вызваны обратно в другую конечную точку. Это фундаментально: dnode полностью асинхронно; он не блокирует, ожидая возврата удаленного метода:

// A contrived example, of course.
// On the server

var server = DNode(function (client) {
    this.echo = function (message) {
        console.log(message)
        return 'Hello you too.'
    }
}).listen(9999)

// On the client

dnode.connect(9999, function (server) {
    var ret = server.echo('Hello, world!')
    console.log(ret) // This won't work
})

Обратные вызовы должны быть переданы, чтобы получить ответы от другой конечной точки. Сложные разговоры могут стать нечитаемыми довольно быстрыми. Этот вопрос Обсуждает возможные решения для этой проблемы.

// On the server

var server = DNode(function (client, callback) {
    this.echo = function (message, callback) {
        console.log(message)
        callback('Hello you too.')
    }

    this.hello = function (callback) {
        callback('Hello, world!')
    }
}).listen(9999)

// On the client

dnode.connect(9999, function (server) {
    server.echo("I can't have enough nesting with DNode!", function (response) {
        console.log(response)
        server.hello(function (greeting) {
            console.log(greeting)
        })
    })
})

Клиент DNODE может быть скриптом, работающим внутри экземпляра узла или может быть встроен в веб -страницу. В этом случае он будет подключаться только к серверу, который обслуживал веб -страницу. Соединять В этом случае очень полезно. Этот сценарий был протестирован со всеми современными браузерами и с интернет -исследователем 5.5 и 7.

DNODE был запущен менее года назад, в июне 2010 года. Он настолько зрел, как может быть библиотека узлов. В моих тестах я не нашел очевидных проблем.

Nowjs

Nowjs предоставляет своего рода магический API, который граничит с милым. У сервера естьeveryone.now сфера. Все, что помещается внутрь everyone.now становится видимым каждому клиенту через их now сфера.

Этот код на сервере поделится echo функционируйте с каждым клиентом, который записывает сообщение на консоли сервера:

// Server-side:

everyone.now.echo = function (message) {
    console.log(message)
}

// So, on the client, one can write:

now.echo('This will be printed on the server console.')

Когда работает функция на стороне сервера, работает, this будет иметь now Атрибут, который специфичен для клиента, который сделал этот звонок.

// Client-side

now.receiveResponse = function (response) {
    console.log('The server said: %s')
}

// We just touched "now" above and it must be synchronized 
// with the server. Will things happen as we expect? Since 
// the code is not multithreaded and NowJS talks through TCP,
// the synchronizing message will get to the server first.
// I still feel nervous about it, though.

now.echo('This will be printed on the server console.')

// Server-side:

everyone.now.echo = function (message) {
    console.log(message)
    this.now.receiveResponse('Thank you for using the "echo" service.')
}

Функции в NowJS могут иметь возвратные значения. Чтобы получить их, должен пройти обратный вызов:

// On the client

now.twice(10, function (r) { console.log(r) }

// On the server

everyone.now.twice = function(n) {
    return 2 * n
}

Это имеет значение, если вы хотите передать обратный вызов в качестве честного аргумента (не для того, чтобы собрать возвращаемое значение) - нужно всегда передать сборщик возвратных значений, или NowJS может запутаться. По словам разработчиков, этот способ получения возвратной стоимости с помощью неявного обратного вызова, вероятно, изменится в будущем:

// On the client

now.crunchSomeNumbers('compute-primes', 

    /* This will be called when our prime numbers are ready to be used. */

    function (data) { /* process the data */ }, 

    /* This will be called when the server function returns. Even if we
    didn't care about our place in the queue, we'd have to add at least
    an empty function. */

    function (queueLength) { alert('You are number ' + queueLength + ' on the queue.') }
)

// On the server

everyone.now.crunchSomeNumbers = function(task, dataCallback) {
    superComputer.enqueueTask(task, dataCallback)
    return superComputer.queueLength
}

И это для API NowJS. Ну, на самом деле есть еще 3 функции, которые можно использовать для обнаружения клиентского соединения и отключения. Я не знаю, почему они не разоблачали эти функции, используя EventEmitter, хотя.

В отличие от DNODE, NowJS требует, чтобы клиент был скриптом, работающим в веб -браузере. Страница, содержащая скрипт, должна служить тем же узлом, который запускает сервер.

На стороне сервера NowJS также нуждается в прослушивании HTTP -сервера. Это должно быть передано при инициализации NowJS:

var server = http.createServer(function (req, response) {
    fs.readFile(__dirname + '/now-client.html', function (err, data) {
        response.writeHead(200, {'Content-Type':'text/html'})  
        response.write(data)
        response.end()
    })
})
server.listen(8080)
var everyone = now.initialize(server)

Nowjs First Commit - пару недель назад (март 2011 г.). Таким образом, ожидайте, что это будет багги. я нашел вопросы я, когда писал этот ответ. Также ожидайте, что его API сильно изменится.

С другой стороны, разработчики очень доступны - Эрик даже направил меня к вызовам. Исходный код не задокументирован, но, к счастью, прост и короткий, и руководство пользователя и примеров достаточно, чтобы начать.

Другие советы

Член команды Nowjs здесь. Исправление на ответ Андрефа:

Nowjs Полностью поддерживает "вызов удаленного метода". Анкет Вы можете передавать функции в качестве аргументов в удаленных вызовах, и вы также можете иметь функции в качестве возвращаемых значений.

Эти функции обернуты NowJS так же, как они находятся в DNODE, так что они выполняются на машине, на которой была определена функция. Это позволяет легко выставлять новые функции на удаленный конец, как в DNODE.

PS Кроме того, я не знаю, хотел ли Андреф подразумевать, что удаленные вызовы только асинхронны на DNODE. Отдаленные звонки также асинхронны для NowJS. Они не блокируют ваш код.

Не пробовал dnode, поэтому мой ответ не является сравнением. Но я хотел бы выпустить несколько опытов, используя NowJS.

Nowjs основан на сокет.io Что довольно глюка. Я часто испытываю тайм-ауты сеанса, отключает и now.ready Событие запускается несколько раз в короткие сроки. Проверить Эта проблема На странице nowjs github.

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

Я планировал создать производственное приложение, используя NowJS, но кажется, что оно недостаточно зрело, чтобы полагаться. Я попробую dnode, если он будет служить моей цели, иначе я переключу на простые старые express.

Обновлять:

Nowjs кажется быть отменен. Нет коммитов с 8 месяцев.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top