Как создать сокет-соединение между двумя серверами - PullRequest
0 голосов
/ 09 мая 2018

У меня есть 2 сервера, один из которых является сервером пользовательского интерфейса, а другой - сервером Кафки.

Файл javascript на моем сервере пользовательского интерфейса получает данные из файла csv, который я читаю построчно и преобразую в JSON. Мне нужно посылать эти данные построчно в формате JSON на мой сервер-производитель Kafka. для дальнейшей работы. Оба сервера имеют свои собственные выделенные IP-адреса. например сервер кафка имеет 192.168.2.12:9098

reportJSON - это переменная, по которой я получаю данные csv в js-файле UI-сервера.

Когда я пытаюсь запустить файл js сервера пользовательского интерфейса, он показывает ошибку:

2018-05-09T15: 18: 56.147Z - ошибка: uncaughtException: io.connect не дата функции = ср. 09 мая 2018 15:18:56 GMT + 0000 (UTC)

UI-соединение внутри файла JavaScript:

var io = require('socket.io');
var socket = io.connect("http://192.168.2.12:9098");
    socket.on('connect', function () {
                                console.log('Connection Established');
                                socket.emit('csvDataFromUI', function (reportJSON) {
                                    console.log("Data inside the csvUpload Handler is = " + reportJSON);
                                });
                            });

код внутри файла javaScript производителя kafka:

var http = require('http');
var app = express();
var host = process.env.HOST || config.host;
var port = process.env.PORT || config.port;

console.log("STARTING EVENT SERVER PRODUCER");

    var server = http.createServer(app).listen(port, function () { });
    server.timeout = 240000;
    var io = require('socket.io').listen(server);
    io.on('connection', function (socket) {
            socket.on('csvDataFromUI', function(data) {
                    console.log("Data in kafka is   = " + data);
                            });             
            //socket.emit('csvDataFromUI', payloadData);   
    });

/ ********************************************** *************************** / Новый код: после этого: https://www.npmjs.com/package/kafka

UI сервер ui.js

создание его как производителя:

var kafka = require('kafka');
var host = '192.168.2.12';
var port = 9098;
producer = new kafka.Producer({

          host:         host,
          port:         port,
          topic:        'Postings',
          partition:    0
 });
producer.connect(function(reportJSON) {
      console.log("rportJSON = " + reportJSON);
      producer.send(reportJSON);
});

Кафка сервер kafkaProducer.js:

var kafkadata = require('kafka');

    console.log("STARTING PRODUCER");

    var consumer = new kafkadata.Consumer({
        // these are the default values
        host:         '192.168.2.12',
        port:          9098 ,
        pollInterval:  2000,
        maxSize:       1048576 // 1MB
    })
    consumer.on('message', function(topic, message) { 
        console.log(message)
    })
    consumer.connect(function() {
        consumer.subscribeTopic({name: 'Postings', partition: 0})
    })

ОШИБКА, которую я получаю на сервере пользовательского интерфейса: ошибка: uncaughtException: подключение ECONNREFUSED reportJSON = не определено

На сервере Kafka я не вижу ни одной ошибки получения и получения: ReferenceError: сообщение не определено

1 Ответ

0 голосов
/ 09 мая 2018

Похоже, что функция io.connect не приходит от npm socket.io.Это происходит из клиентской части socket.io .Поэтому традиционно вы будете использовать socket.io npm для размещения вашего сервера на основе сокетов, а затем использовать сокет io JS lib на стороне клиента для подключения и взаимодействия с указанным сервером.

Но вы хотите сделать это сервер-сервер.Согласно этому вопросу переполнения стека , последний ответ указывает, что когда вы npm install socket.io автоматически разместите версию в вашем node_modules.Вы можете сделать что-то вроде:

var socketIoClient = require('socket.io-client');
var socket = socketIoClient.connect("http://192.168.2.12:9098");

РЕДАКТИРОВАТЬ: Похоже, они экспортируют код на стороне клиента в виде модуля, поэтому это должно быть возможноделать то, что я упомянул выше.Я волновался, что клиентская часть JS не будет переводиться на серверную сторону как модуль.

...