2012-04-18 113 views
1

我一直在尋找這個特定的問題,因爲我找不到任何關於這個主題的信息(那個沒有過時),我只是決定在其他事情上工作。但是現在我正處於需要將數據(我構建的)發送到使用其ID並使用node.js和socket.io連接到我的服務器的特定客戶端的程度。我已經將ID存儲在每個新連接的對象中。我需要知道的是將它發送到我選擇的連接ID的方法。Node.JS Socket.IO發送數據包到特定的連接ID

類似於:function send(data,client.id){};

我正在使用http服務器,而不是TCP。

這可能嗎?

編輯:

server = http_socket.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/html'}); 
    res.end(respcont); 
    client_ip_address = req.header('x-forwarded-for'); 
    }); 
socket = io.listen(1337); // listen 
//============================================= 
// Socket event loop 
//============================================= 
socket.on ('connection', function (client_connect) { 
    var client_info = new client_connection_info();  // this just holds information 
    client_info.addNode(client_connect.id, client_connect.remoteAddress, 1); // 1 = trying to connet 

    var a = client_info.getNode(client_connect.id,null,null).socket_id; // an object holding the information. this function just gets the socket_id 
    client_connect.socket(a).emit('message', 'hi'); 

    client_connect.on('message', function (data) { 
     }); 
    client_connect.on ('disconnect', function() { 

    ); 
}); 

解決辦法:我想出來的只是實驗...你有待辦事項的是確保你存儲插座,而不是socket.id(像我在做),並使用相反。

client_info.addNode(client_connect.id, client_connect.remoteAddress, client_connect, 1) 

var a = client_info.getNode(client_connect.id,null,null,null).socket; 
    a.emit('message', 'hi'); 
+0

僅供參考,HTTP是一種通過TCP連接工作的協議。而TCP是一種使用IP的協議,它反過來使用(大部分)以太網,它使用電信號或光信號。 – 2012-04-18 05:20:24

+0

啊謝謝。我只是不想爲TCP版本而不是http版本獲得幫助(如果這有所幫助)。其實,我剛剛纔知道這一點! :) – user1328762 2012-04-18 05:23:29

回答

1

如果你需要做到這一點,最容易做的事情是建立和保持一個全球關聯數組映射ID來連接:那麼你可以查看相應的連接,當您需要,只需使用常規發送功能。你需要一些邏輯來從數組中刪除連接,但這不應該太痛苦。

+0

我知道必須有一些方法來完成我想要做的事情,因爲它可能在更高版本的node.js和socket.io中。編輯:我已經存儲連接ID,我還需要與他們一起存儲什麼? – user1328762 2012-04-18 06:11:22

+0

我接受了你的答案,因爲它是正確的。我無法理解你想傳達什麼。 – user1328762 2012-04-18 08:31:25

+0

@Femi如果您沒有考慮可伸縮性,這是一個很好的解決方案。要在多臺機器上工作真的很困難。 – freakish 2012-04-18 09:58:18

1

是的,這是可能的。

io.sockets.socket(id).emit('message', 'data'); 
+0

嗯,我似乎無法得到它的工作。我用我打電話的方式更新我的代碼。 – user1328762 2012-04-18 06:45:09

0

您的解決方案有一個主要缺點:縮放。當你的應用需要更多的一臺機器時,你會做什麼?使用內部ID也可能很困難。我建議使用外部ID(如用戶名)。

類似於this post我建議使用房間(與Redis一起允許縮放)。爲每個新套接字添加私人空間(例如,基於用戶名)。代碼可能如下所示:

socket.join('priv/' + name); 
io.sockets.in('priv/' + name).emit('message', { msg: 'hello world!' }); 

該解決方案允許多臺機器向任何用戶發送事件。在我看來,它也相當簡單和優雅。

+0

我無法使用類似於服務器遊戲引擎的解決方案。我必須使用套接字和數據庫信息爲每個玩家創建對象。 – user1328762 2012-04-18 08:33:17

+1

當然可以。要存儲與給定套接字關聯的數據,您可以使用'socket.set'和'socket.get'以及JSON編碼。你應該改變這個概念:把信息放在套接字裏(好),而不是套接字裏面的信息(壞)。 – freakish 2012-04-18 09:57:00