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