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, время: 01:44. |