2012-07-06 56 views
12

我一直在網上搜索,沒有運氣。我想弄清楚如何從一個用戶發送私人信息到另一個用戶。有很多片段,但我不確定客戶端/服務器的交互。如果我有要發送到的套接字的ID,我如何將它發送到服務器,以及如何確保服務器只將消息發送到該接收器套接字?socket.io私信

是否有任何人都知道的教程或演練?

+0

我創建了一個陣列的所有用戶,然後再使用io.sockets.socket(用戶ID).emit,但它仍然不發送。更新的服務器文件是[here](http://pastebin.com/k770CEaM),客戶端文件是[here](http:// pastebin。com/V6Cdg113)如果你可以看看它,我會很感激! – 2012-07-10 08:38:36

回答

18

沒有教程需要。該Socket.IO FAQ是在這一個非常簡單的:

socket.emit('news', { hello: 'world' }); 

編輯:詢問如何後來拿到socket對象時鄉親鏈接到這個問題。沒有必要。當一個新的客戶端連接時,將該套接字的引用保存在你保存用戶信息的任何對象上。我的意見如下:

在某處腳本的頂部,設置一個對象來保存用戶的信息。

var connectedUsers = {};

在你.on('connection')功能,即插槽添加到您的新對象。 connectedUsers[USER_NAME_HERE] = socket;然後您可以稍後輕鬆檢索它。 connectedUsers[USER_NAME_HERE].emit('something', 'something');

+8

這是發送給用戶的'新聞'編號? 「新聞」,「你好」,「世界」有什麼功能?這段代碼沒有意義。如何從客戶端獲取消息和目標用戶?... 「socket.emit('news',{hello:'world'});」不是直接的.. – 2012-07-06 04:55:33

+1

不,這會引發連接到'socket'的客戶端的'news'事件。處理該事件的函數的第一個參數是對象'{hello:'world'}'。您需要在連接時保留對該套接字對象的引用,以備後用。 – Brad 2012-07-06 04:57:31

+0

另外請注意,*有*是一種稍後獲取該套接字的方法,但它有點麻煩。參見:https://github.com/LearnBoost/socket.io/issues/503另見:http://stackoverflow.com/questions/6913801/sending-message-to-specific-client-with-socket-io-和空消息隊列 – Brad 2012-07-06 04:59:49

6

我能想到的最簡單的方法是有使用他們的ID或名稱作爲關鍵字所有用戶的哈希值,並有自己的窩爲價值的一部分,那麼,當你想將消息發送到只是他們你拉的是插座,放出它......是這樣的:

users[toUser].emit('msg',"Hello, "+toUser+"!"); 
16

下面是一個代碼片段,應該幫助

客戶端(發送消息)

socket.emit("private", { msg: chatMsg.val(), to: selected.text() }); 

其中「到」指的是ID發送私人消息和「MSG」是內容

客戶端側(接收消息)

socket.on("private", function(data) {  
    chatLog.append('<li class="private"><em><strong>'+ data.from +' -> '+ data.to +'</strong>: '+ data.msg +'</em></li>'); 

其中chatLog是一個div顯示所述聊天消息

服務器側

client.on("private", function(data) {   
     io.sockets.sockets[data.to].emit("private", { from: client.id, to: data.to, msg: data.msg }); 
    client.emit("private", { from: client.id, to: data.to, msg: data.msg }); 
    }); 
+0

在你的服務器端代碼中,什麼是客戶端?爲什麼不使用socket.on? chat_server.js代碼是[here](http://pastebin.com/nxHdzHDg),客戶端代碼是[example_chat.tpl.php](http://pastebin.com/t0h7rSFv) – 2012-07-10 04:55:15

+1

好的...我發現客戶端只是您用於io.sockets.on('連接')的名稱。 – 2012-07-10 05:21:12

+0

你猜對了。對不起,這在代碼中並不明顯。 – almypal 2012-07-10 07:22:18

1
在socket.io 1.0使用

io.sockets.connected[<socketid>] 

您可以存儲只是套接字ID。像這樣:

var users = {}; 
users[USER_NAME] = socket.id; 

則:

io.sockets.connected[users[USER_NAME]] 
    .emit('private', { 
     msg:'private message for user with name '+ USER_NAME 
    });