2016-07-04 59 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