2011-08-20 57 views
-1

當我命名空間我的應用程序時,遇到了一個問題,我想將數據發送到特定套接字,以下是我正在使用的代碼的縮寫版本:當發送到特定套接字時,socket.io中的名稱間隔

var io = require('socket.io').listen(config.web.port); 

var chat = io.of('space').on('connection', function (socket) { 

    // This works: 
    // Input: xhr-polling received data packet 5::/space:{"name":"test"} 
    // Output: xhr-polling writing 5::/space:{"name":"test","args":[{"msg":"test"}]} 
    socket.on('test', function(){ 
    socket.emit('test',{msg: "test"}); 
    }); 

    // This fails: 
    // Input: xhr-polling received data packet 5::/space:{"name":"test2"} 
    // Output: xhr-polling writing 5:::{"name":"test2","args":[{"msg":"test2"}]}  
    socket.on('test2',function(){ 
    io.sockets.socket(socket.id).emit('test2',{msg: "test2"}); 
    }); 
} 

如您所見,第二個缺少輸出中的命名空間部分。在真正的應用程序中,我從客戶端管理器中選擇套接字ID,所以我在這段代碼中使用了socket.id而不是client.getSocketId(),但這個想法與我只是迴應起源客戶在這裏。

如何在輸出到客戶端時使第二種方法使用正確的名稱空間?

回答

5

檢出the source for SocketNamespace後,看起來語法是io.of('space').socket(id).emit(...

[編輯每FUU的評論]

爲了找到這個,我查了Socket.IO GitHub repository,並尋找那些不得不做namespaces-- namespace.js似乎符合該法案的文件。該文件不是很長,所以我掃描它尋找方法SocketNamespace的原型,看起來可能做我們想要的。

由於您致電io.sockets.socket在全局名稱空間上查找套接字,因此SocketNamespace.prototype.socket對我很有幫助。此外,它需要一個名爲sid的參數,並且該方法的主體似乎是通過此ID從套接字哈希中獲取套接字。 A Socket是我們想要的(它擁有emit方法),所以我推測這是在這種情況下使用的方法。

+0

謝謝,解決了這個問題!你是否會如此善良,並編輯你的答案,以包括你從SocketNamespace的源頭中找出的方式?通讀它我無法弄清楚。我想了解細節。 :) – Fuu

+0

很高興工作! –

+0

嗯,我得到了SocketNamespace.prototype.socket部分的功能,但是你如何從那個推斷出'io.sockets.socket()'中的套接字需要替換('命名空間')? – Fuu

相關問題