2015-07-28 64 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

是的,這是有道理的。另一個想法是使用pub/sub模型。所以基本上所有toSOMETHING套接字都會在它們連接後立即訂閱自定義事件。然後,每個readDB事件都會在它們上發出該事件。沒有socketIO,它仍然會回到數組迭代器。但是對於socketIO,也許你可以發出套接字正在監聽的事件(不使用迭代器)。 – walmik

+0

是的,現在我嘗試使用內置的sails.js socket.io支持來處理這個問題,但是不能讓它監聽自發消息。 – glebcha