@x2roma
Инженер. Учусь веб программированию.

TCP/XML подписка на получение данных с помощью NodeJS?

Друзья. В реальном времени нужно получать информацию. С синхронным по своей сути php получается довольно несерьезная вещь. Начал изучать NodeJS. Но столкнулся с проблемой. Сама система работает следующим образом: Своим первым запросом клиент объявляет серверу используемую
версию протокола TCP/XML:
<proto ver="1.0"/>
Сервер сообщает, что он готов к работе по указанной версии протокола:
<proto ver="1.0">OK</proto>

Ну дальше уже так же передаем логин, пароль, что нужно получать, и команду подписки и система при получениии данных будет из отправлять нам.
Так вот в php это решатеся так:
$socket = socket_create(AF_INET, SOCK_RAW, SOL_TCP);
    //AF_INET - семейство протоколов
    //SOCK_STREAM - тип сокета
    //SOL_TCP - протокол
  $result = socket_connect($socket, $address, $port);
  $msg = '<proto ver="1.0"/>';
  echo "Сообщение серверу: $msg\n";
    socket_write($socket, $msg, strlen($msg)); //Отправляем серверу сообщение
  $out = socket_read($socket, 128); //Читаем сообщение от сервера
var_dump($out);


Но тут фишка в том что в PHP можно выбрать тип сокета raw. И ответ приходит. И подписка работает. Но к сожалению недолго. И проконтроллировать процесс отключения невозможно. Вот код на JS который, к сожалению не возвращает ответа. Я так понимаю что стучится он по telnet.
var net = require('net');
var HOST = '172.16.221.106';
var PORT = 14074;

var loopConnection = function() {
    var client = new net.Socket();

    client.connect(PORT, HOST, function() {
        console.log('CONNECTED TO: ' + HOST + ':' + PORT);
        client.write('<proto ver="1.0"/>');
    });

    client.on('data', function(data) {
        console.log('DATA: ' + data.toString());
        client.destroy();
    });

    client.on('close', function() {
        console.log('Connection closed');
        setTimeout(function() {
            loopConnection(); // restart again
        }, 1000); // Wait for one second
    });
};

loopConnection(); // Initialize and first call loopConnection


установил raw-socket но он только создает сервер. функционала клиента в нем нет. Как быть, куда копать, что изучать?

ps за помощь скину могарыч на киви или карту =)
  • Вопрос задан
  • 84 просмотра
Решения вопроса 1
megafax
@megafax
web-программист
Что то типа такого должно получиться?
const net = require('net');
const HOST = '172.16.221.106';
const PORT = 14074;
const client = new net.Socket();

let socketData = '';
let socketWaitHello = true;

client.connect(PORT, HOST);

client.on('connect', () => {
	console.log(`CONNECTED TO: ${HOST}:${PORT}`);
	client.write(`<proto ver="1.0"/>`);
	socketWaitHello = true;
});

client.on('data', (data) => {
	socketData += data.toString();
});

client.on('end', () => {
	console.log(`DATA: ${socketData}`);
	if (socketWaitHello) {
		if (socketData === `<proto ver="1.0">OK</proto>`) {
			client.write(`<some_auth_data />`);
		}
		else if (socketData === `<auth_is_accepted />`) {
			socketWaitHello = false;
			client.write(`<get_some_data />`);
		}
		else {
			throw new Error(`Server don't answered for hello`);
		}
	}
	else {
		do_something_with_data(socketData);
	}

	socketData = '';
});

client.on('close', () => {
	console.log(`Connection closed`);
});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
D2C.io Екатеринбург
от 70 000 руб.
OneTwoTrip! Москва
от 120 000 до 200 000 руб.
MobileUp Санкт-Петербург
от 100 000 руб.
15 авг. 2018, в 23:38
300 руб./за проект
15 авг. 2018, в 22:39
60000 руб./за проект
15 авг. 2018, в 21:18
30000 руб./за проект