2016-07-04 60 views
0

在socket.io我们创建一个实例,并使用插座这样如何使用来自其他功能的套接字事件?

var server = require('http').createServer(); 
var io = require('socket.io')(server); 
io.on('connection', function(socket){ 
    socket.on('event', function(data){}); 
    socket.on('disconnect', function(){}); 
}); 
server.listen(3000); 

我们怎样才能创造这样的其他功能的插座事件。有没有任何方法或技巧,以适当的。

var server = require('http').createServer(); 
var io = require('socket.io')(server); 
io.on('connection', function(socket){ 
    socket.on('event', function(data){}); 
    socket.on('disconnect', function(){}); 
}); 

var f1 = function (socketID) { 
    if(socketID){ 
     io.to(socketID).emit('event1', 'event1 data'); //working 
     socket.on('call2', function (data) { // not working 
     }); 
    } 
} 
server.listen(3000); 

回答

0

当你发送请求,并试图等待这一请求特定的响应,它是有点棘手使用基于消息的协议,像socket.io对于这种情况。 HTTP完全为请求/响应而设计,因为单个连接仅用于该请求/响应,因此响应是属于您的请求的响应。

这对于socket.io不适用。这是一个基于消息的方案。当您发送消息并等待从另一端(在多用户环境中)返回消息时,您必须非常小心,以免发生以下情况:

  1. 安装太多事件侦听器并结束与重复。
  2. 您得到的回应是专门针对您的原始请求,而不是针对可能在类似时间范围内发生的其他请求。

解决此问题的一种方法是为所有请求/响应消息添加请求标识符。当你发送请求时,你添加一个唯一的请求ID。当返回响应时,它包含该请求ID,然后您的代码可以知道哪个响应属于哪个请求。

下面是如何实现的请求ID概念(这需要另一端的合作,并返回它发送相同的请求ID)的想法:

var idCntr = 0; 
function f1(socketID) { 
    if(socketID){ 
     var id = idCntr++; 
     io.to(socketID).emit('event1', {id: id, data: 'event data'}); 

     function listener(data) { 
      // if this is our message 
      if (data.id === id) { 
       // once our response is received, remove event handler 
       socket.removeListener('responseToEvent1', listener); 

       // process response here 
       // code here... 
      } 
     } 

     // wait for our response 
     socket.on('responseToEvent1', listener); 
    } 
} 

或者,这里有一个更面向对象的方案这增加了Socket对象的方法称为.emitRequest()

var idCntr = 0; 
socket.emitRequest = function(msg, data, responseMsg, responseFn) { 

    var id = idCntr++; 

    function listener(response) { 
     // if this is our message 
     if (response.id === id) { 
      // once our response is received, remove event handler 
      this.removeListener(responseMsg, listener); 
      // call response handler 
      responseFn(response.data); 
     } 
    } 

    this.emit(msg, {id: id, data: data}); 
    this.on(responseMsg, listener); 
} 

注意:对于这两个代码段的,你连接的另一端需要进行合作,并返回原始请求S的id财产o接收监听者可以知道哪个请求发出哪个响应。

+0

@Rishi - 这是否回答了您的问题? – jfriend00