@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 за помощь скину могарыч на киви или карту =)
  • Вопрос задан
  • 155 просмотров
Решения вопроса 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`);
});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы