2015-07-28 4 views
0

У меня есть несколько клиентских подключений, и нужно слушать данные в другом. Как я могу сделать мост между ними (а не итератором массива)?Как получить доступ к сокету tcp из другого сокета?

Пример псевдокод:

socket.on('data', function(chunk){ 
    decodeChunk(chunk.toString('hex'), function(response){ 
    if(response.name === 'toDB'){ 
     //write smth. to DB 
    } 

    if(response.name === 'readDB'){ 
     //watch all incoming tcp sockets with 'toDB' and continiously 
     //send to client connected with this socket 
    } 

    }); 
}) 

я могу использовать что-то вроде RabbitMQ, но это не для текущей стадии для того, чтобы поддержать развитие более гибким.

Любые предложения оценены.

+0

Можете ли вы поделиться соответствующие части вашего кода? – Peanut

+0

Извините, не могу использовать полный код и поэтому разместил некоторый псевдокод. Надеюсь, что это прояснит ситуацию. – glebcha

ответ

0

кончался с такой службы:

var SocketMedium = { 
    sessions: {}, 
    onEvent: function (event, cb) { 
    if (!this.sessions[event]) { 
     this.sessions[event] = []; 
     this.sessions[event].push(cb); 
    } else { 
     this.sessions[event].push(cb); 
    } 

    console.log('onEvent: ', event); 
    }, 
    rTrigger: function (event, data) { 
    console.log('Started rTrigger: ', event); 
    if(this.sessions[event]){ 
     console.log('FOUND: ', event); 
     this 
     .sessions[event] 
     .forEach(function (cb) { 
      cb(data); 
     }) 
    } 
    console.log('Completed rTrigger', this.sessions); 
    }, 
    cleaner: function(sessionId){ 

    var event = 'session' + sessionId; 

    if (this.sessions[event]) { 
     delete this.sessions[event]; 
     console.log('SocketMedium cleaned: ', this.sessions[event]); 
    } 

    console.log('SocketMedium can not find: ', this.sessions[event]); 
    } 
}; 

module.exports = SocketMedium; 
0

Это немного сложно решить с помощью чисто псевдокода, но я все равно дам ему шанс.

Если я правильно понимаю это, то toDB и readDB являются образцовыми данными, и есть несколько toDB. Это означает, что у вас также есть куча toXY с соответствующим readXY ИЛИ связкой toPQ с соответствующим readPQ. Если это так, то, как только подключается toSOMETHING, вы можете сохранить этот сокет под readSOMETHING. Если ключ уже существует, вы просто добавляете к нему сокет toSOMETHING. Со временем это будет выглядеть примерно так:

var socketData = { 
    readDB: { 
     sockets: [ 
      <socket-object-toDB-1>, 
      <socket-object-toDB-2>, 
      <socket-object-toDB-3> 
     ] 
    }, 
    readXY: { 
     sockets: [ 
      <socket-object-toXY-1>, 
      <socket-object-toXY-2>, 
      <socket-object-toXY-3> 
     ] 
    } 
} 

И тогда ваш псевдо-код будет, вероятно, искать что-то вроде

socket.on('data', function(chunk){ 
    decodeChunk(chunk.toString('hex'), function(response){ 
    if(response.name === 'toDB'){ 
     //write smth. to DB 
     if (socketData['readDB']) { 
     // already exists, simply append incoming socket to it's sockets array 
     socketData['readDB'].sockets.push(socket); 
     } else { 
     // does not exist, add it with a sockets array 
     socketData['readDB'] = { 
      sockets: [socket] 
     } 
    } 

    if(response.name === 'readDB'){ 
     // Write to all sockets of readDB 
     socketData['readDB'].sockets.forEach(function(sock) { 
      sock.write('Whatever message\r\n'); 
     }); 
    } 

    }); 
}) 
+0

Это первая идея, которая пришла ко мне, но я заметил «не массивный итератор», чтобы найти возможное решение без такого дорогостоящего метода. Но все равно спасибо! – glebcha

+0

Да, это имеет смысл. Другая мысль - использовать паб/подмодуль. Таким образом, в основном все сокеты toSOMETHING будут подписаны на пользовательское событие, как только они подключатся. Затем каждое событие readDB будет выделять это событие на них. Без socketIO он все равно вернется к итераторам массива. Но с socketIO возможно вы можете испустить событие, которое прослушивают сокеты (без использования итераторов). – walmik

+0

Да, теперь я пытаюсь использовать встроенную поддержку sails.js socket.io, чтобы справиться с этим, но не могу заставить его прослушивать сообщения с самовоспроизводством. – glebcha

Смежные вопросы