2014-09-28 47 views
2

我的問題是什麼是發送數據到特定房間的特定客戶端的正確方法。我使用的插座IO和下面寫的代碼:如何發送數據到特定的客戶端在一個特定的房間與插座io

我用命令:

socket.to(socket.id).emit('change', {data}) 

但是客戶從來沒有得到這個命令。有人知道爲什麼

下面是我的代碼片段:

服務器代碼:

io.on('connection', function (socket) { 
    socket.on('channelJoin', function(channel){ 
     socket.join(channel); 

     if(deltasByChannel[channel]) 
     { 
      console.log("sending initial data to: "+socket.id); 
      socket.to(socket.id).emmit('change', deltasByChannel[channel]); 
     } 

     socket.on("change", function(delta){ 
      console.log("channel: " + channel+" was edited!"); 
      console.log(deltasByChannel[channel]); 
      deltasByChannel[channel] ? deltasByChannel[channel] = deltasByChannel[channel].concat(delta) : deltasByChannel[channel] = delta; 
      socket.broadcast.to(channel).emit('change', delta); 
     }); 
    }); 
}); 


http.listen(3000, function() { 
    console.log('listening on *:3000'); 
}); 

客戶端代碼:

var channel = window.location.pathname; 
var socket = io.connect(); 

//Ace handlers 
var sendUpdateData = function(e){ 
    socket.emit("change", [e.data]); 
}; 



socket.on('connect', function(){ 
    socket.on("change", function(data){ 
     console.log("change event received!"); 
     editor.getSession().removeListener('change', sendUpdateData); 
     editor.getSession().getDocument().applyDeltas(data); 
     editor.getSession().on('change', sendUpdateData); 
    }); 
    editor.getSession().on('change', sendUpdateData); 

    socket.emit('channelJoin', channel); 
}); 

只是爲了避免混淆編輯器對象用於偵聽change事件好。它來自完全不同的庫(ace.js),與我的socket io問題無關。

下面

是爲了更清楚,服務器代碼的另一個片段:

var http = require('http').Server(app); 
var io = require('socket.io')(http); 

http.listen(3000, function() { 
    console.log('listening on *:3000'); 
}); 
+0

你能告訴你實例的'http'對象的代碼,和'io'對象連接到服務器,可能使用'聽'方法? – bencripps 2014-09-28 02:14:11

+0

好吧,我把這部分的另一個片段。 – 2014-09-28 02:17:51

+0

我假設'emmit'是一個錯字,而你真的使用'emit'? – bencripps 2014-09-28 02:22:54

回答

4

我認爲有大約超過使用socket.io套接字發送數據有些混亂。您可以選擇使用rooms或私有名稱空間來發出事件或數據,您可以向所有連接的套接字廣播,也可以將數據發送到特定的ID。

在你的情況下,你應該只是選擇一個socket.id,發送一個事件到一個特定的連接。你可以這樣做:

io.sockets.connected[ socket.id ].emit('privateMsg', 'hello this is a private msg');

您也可以使用to()方法結合broadcast還有:

socket.broadcast.to(socket.id).emit('privateMsg', 'hello this is a private msg');

這將達到其匹配用戶的socket.id你傳遞作爲論據。

一個「房間」或私人命名空間內聯繫用戶,您還可以使用to()方法:

io.to('some room').emit('some event');

在這種情況下some room將你定義的channel變種,它應該匹配已經實例化的預定義變量。

有關房間/命名空間/和達到特定的套接字連接的詳細信息:http://socket.io/docs/rooms-and-namespaces/#

+3

我不是OP,但是男孩,我不同意socket.io有很好的文檔。這很漂亮,但內容極其缺乏。試着找到'io.to()'的文檔。它不存在。這是文檔中的空白部分。從其他例子來看,你可以用它來廣播聊天室,但是你必須從其他例子中推斷出它是否可以用於其他目的,例如發送到特定的套接字。請告訴我們在文檔中的哪個位置可以知道你可以這樣做:'io.sockets.connected [socket.id] .emit(...)'。 – jfriend00 2014-09-28 03:07:47

+0

我想我已經找到了在我自己的工作中工作的方法,但'socket.broadcast.to(id).emit('my message',msg);'在這裏顯示在文檔中:http:// socket .io/docs/rooms-and-namespaces /#並不意味着開始一場戰爭,我只是認爲在socket的人已經做得很好了 – bencripps 2014-09-28 03:12:36

+2

我很喜歡socket.io的功能。該文件非常糟糕。我只能通過在調試器中設置斷點並檢查socket.io數據結構和方法來找出我需要做的簡單事情。它不應該那麼難。說真的,你使用'socket.broadcast.to()'發送到一個套接字,代碼示例在文檔的聊天室部分?這很奇怪。 – jfriend00 2014-09-28 03:15:55

相關問題