Простое клиент-серверное приложение UDP NodeJS с использованием брокера

Я пишу простое клиент-серверное приложение NodeJS, использующее протокол UDP. Суть этого приложения в том, что оно требует использования брокера, функция которого в данном случае состоит в том, чтобы связать отправителя с получателем. Требования говорят мне, что отправителю не нужно знать IP-адрес получателя и номер порта — ему нужно знать только соответствующий IP-адрес и ПОРТ брокера. После этого брокер отправит сообщение клиента на сервер на основе IP-адреса и порта сервера.

Чтобы прояснить предыдущий (? запутанный) абзац, ниже вы найдете иллюстрацию того, что я сделал до сих пор:

отправитель.js

var PORT1 = XXXXX;
var HOST = '127.0.0.1';
var fs = require('fs');
var dgram = require('dgram');
var client = dgram.createSocket('udp4');


fs.readFile('Path/to/the/file','utf8', function (err, data) {
  if (err) throw err;
  var message = new Buffer(data);

  client.send(data, 0, message.length, PORT1, HOST, function(err, bytes) {
    if (err) throw err;
    console.log('UDP message sent to ' + HOST +':'+ PORT1);
    client.close();
    });
});

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

брокер.js

var PORT1 = XXXXX;
var PORT2 = YYYYY;
var HOST = '127.0.0.1';
var dgram = require('dgram');
var server = dgram.createSocket('udp4');
var client = dgram.createSocket('udp4');

server.on('listening', function () {
    var address = server.address();
    console.log('UDP broker listening on ' + address.address + ":" + address.port);
});

server.on('message', function (message, remote) {
  client.send(message, 0, message.length, PORT2, HOST, function(err, bytes) {
    if (err) throw err;
    console.log('UDP message sent to ' + HOST +':'+ PORT2);
    client.close();
  });
    console.log(remote.address + ':' + remote.port +' - ' + message);
});

server.bind(PORT1, HOST);

Здесь PORT1 — это порт, который слушает брокер (ожидание входящих сообщений от отправителя), а PORT2 — это порт, который передает сообщение получателю (и, соответственно, получатель слушает этот порт).

приемник.js

var PORT2 = YYYYY;
var HOST = '127.0.0.1';
var fs = require('fs');
var dgram = require('dgram');
var server = dgram.createSocket('udp4');
var parser = require('xml2json');

server.on('listening', function () {
    var address = server.address();
    console.log('UDP receiver listening on ' + address.address + ":" + address.port);
});

server.on('message', function (message, remote) {
    console.log(remote.address + ':' + remote.port +' - ' + message);
  var contents = fs.writeFile("/Path/To/Written/File", parser.toJson(message),
  function(error){
      if (error) {
        console.log("error writing");
       }
  console.log("File was saved");
    });
});

server.bind(PORT2, HOST);

Получатель получает сообщение от брокера и записывает его в файл в формате JSON.

Вот результаты:

Отправитель

UserName's-MacBook-Pro:UDP server UserName$ node sender.js 
UDP message sent to 127.0.0.1:XXXXX

Брокер

UserName's-MacBook-Pro:UDP server UserName$ node broker.js 
UDP broker listening on 127.0.0.1:XXXXX
127.0.0.1:60009 - <?xml version="1.0"?>
<Some XML content here>
</XML content ends here>
UDP message sent to 127.0.0.1:YYYYY

Получатель

UserName's-MacBook-Pro:UDP server UserName$ node receiver.js 
UDP receiver listening on 127.0.0.1:YYYYY
127.0.0.1:63407 - <?xml version="1.0"?>
<XML contents here>
</XML content ends here>
File was saved

Прошу прощения за длинный пост, но я хочу указать все детали, чтобы устранить (надеюсь) любые неясности. Теперь по делу,

ЗДЕСЬ мой вопрос

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

В случае нескольких отправителей и получателей брокер должен управлять портами, чтобы связать отправителя с получателем (с любыми указанными критериями).

Заранее спасибо!


person v01d    schedule 08.10.2015    source источник


Ответы (1)


Взгляните на эту книгу «Шаблоны проектирования Node.js, издатель: Packt Publishing By: Mario Casciaro ISBN: 978-1-78328-731-4 Year: 2014» на странице 361. Это именно то, что вы хотите сделать с очень хорошее объяснение. Надеюсь, это поможет!

person Chris    schedule 08.10.2015