eventEmitter и net.server
Продолжаю осваивать nodejs. Столкнулся с тем, что не знаю как отправить данные, принятые в один порт через другой порт. Почитав, узнал что net.server содержит в себе eventEmitter. Но что-то не до конца понимаю. Обработчик не видит, что генератор сработал.
const server_1=net.createServer(function(sock,req) { //тут принимаем данные, теперь нужно отправить их в другой server.emit('event');// }).listen(tcp_server.port1, tcp_server.ip); const server_2=net.createServer(function(sock,req) { //тут обработчик server.on('event', function(data) { console.log('EVENT: '); }); }).listen(tcp_server.port2, tcp_server.ip); |
Да, ещё я так понимаю чтобы обработчик увидел событие, нужно чтобы оно ушло именно на tcp_server.port2. Вот тут непонятно как это сделать.
P.S. Так. Один способ придумал. В сервере 1 создаём подключение к серверу2 и кидаем данные:
vg=new net.Socket;
vg.connect(tcp_server.port2,tcp_server.ip);
vg.write('data',tcp_server.port2,tcp_server.ip);
Затем берём адрес нужного клиента из таблицы подключений, вставляем его в
socket.write('data',clientport,clientip)
Что скажете? |
В общем, нашёл как делают по-нормальному. Есть такая штука как stream.
Т.е. при 'connect' добавляем новый сокет в нашу таблицу подключений: streams.push(sock); //Добавляем в массив потоков При 'close' удаляем из таблицы тот, который отвалился
sock.on('close', function(data)//событие "клиент отключился"
{
var i=0;
var arr;
streams.forEach(function(stream)
{
if (stream.remoteAddress==sock.remoteAddress && stream.remotePort==sock.remotePort)
{
if (i!=0)
{
streams.splice(i);
}
else
{
streams.shift();
}
}
i++;
});
Ну и далее нам в любом месте программы уже доступны все активные потоки. И можно отправлять данные вне зависимости от событий сокета. Например, отправить в первый поток: stream.write(streams[1].remoteAddress + ':' + data, 'utf8'); |
-VenoM-,
интересно зачем строки 4 и 19 нужны? |
-VenoM-,
Обьекты в js по ссылке, т.е. в socket.on('close') ты уже будешь знать отвалившийся сокет, через indexOf находишь индекс и через splice удаляешь. Или еще лучше --пробросить stream через Array.find() -- es6. |
Цитата:
рони Наследие МК:). Там нежелательно оставлять неопределённые переменные. |
Цитата:
|
Это я понял. Исправил.
|
| Часовой пояс GMT +3, время: 15:49. |