Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.11.2016, 22:24
Аспирант
Отправить личное сообщение для -VenoM- Посмотреть профиль Найти все сообщения от -VenoM-
 
Регистрация: 31.10.2016
Сообщений: 44

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);
Ответить с цитированием
  #2 (permalink)  
Старый 01.12.2016, 10:20
Аспирант
Отправить личное сообщение для -VenoM- Посмотреть профиль Найти все сообщения от -VenoM-
 
Регистрация: 31.10.2016
Сообщений: 44

Да, ещё я так понимаю чтобы обработчик увидел событие, нужно чтобы оно ушло именно на 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)

Что скажете?

Последний раз редактировалось -VenoM-, 01.12.2016 в 15:51.
Ответить с цитированием
  #3 (permalink)  
Старый 07.12.2016, 17:52
Аспирант
Отправить личное сообщение для -VenoM- Посмотреть профиль Найти все сообщения от -VenoM-
 
Регистрация: 31.10.2016
Сообщений: 44

В общем, нашёл как делают по-нормальному. Есть такая штука как 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');
Ответить с цитированием
  #4 (permalink)  
Старый 07.12.2016, 18:21
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

-VenoM-,
интересно зачем строки 4 и 19 нужны?
Ответить с цитированием
  #5 (permalink)  
Старый 07.12.2016, 18:40
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

-VenoM-,
Обьекты в js по ссылке, т.е. в socket.on('close') ты уже будешь знать отвалившийся сокет, через indexOf находишь индекс и через splice удаляешь. Или еще лучше --пробросить stream через Array.find() -- es6.
Ответить с цитированием
  #6 (permalink)  
Старый 09.12.2016, 09:47
Аспирант
Отправить личное сообщение для -VenoM- Посмотреть профиль Найти все сообщения от -VenoM-
 
Регистрация: 31.10.2016
Сообщений: 44

Цитата:
Обьекты в js по ссылке, т.е. в socket.on('close') ты уже будешь знать отвалившийся сокет, через indexOf находишь индекс и через splice удаляешь
Согласен, так и сделал. Через .find() ИМХО - ничем не лучше.

рони
Наследие МК. Там нежелательно оставлять неопределённые переменные.
Ответить с цитированием
  #7 (permalink)  
Старый 09.12.2016, 10:54
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Сообщение от -VenoM-
Наследие МК. Там нежелательно оставлять неопределённые переменные.
не понял ваш ответ ... вопрос был про forEach в котором уже есть i, и нет смысла обьявлять i дополнительно.
Ответить с цитированием
  #8 (permalink)  
Старый 09.12.2016, 12:56
Аспирант
Отправить личное сообщение для -VenoM- Посмотреть профиль Найти все сообщения от -VenoM-
 
Регистрация: 31.10.2016
Сообщений: 44

Это я понял. Исправил.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
EventEmitter (ES 6) GayCoder Ваши сайты и скрипты 10 20.11.2016 08:18
dgram и eventEmitter reeiit Node.JS 0 06.06.2016 02:11
Можно ли в Redux использовать EventEmitter? yazonnile Общие вопросы Javascript 7 06.04.2016 22:51
EventEmitter cyber Оффтопик 19 02.02.2014 18:32