2013-09-22 41 views
3

我有写入的CoffeeScript下面的代码,使得使用socket.io和的node.js的在服务器侧Socket.io不发射/接收事件,而使用名称空间

服务器

io.of("/room").authorization (handshakeData, callback) -> 
    #Check if authorized 
    callback(null,true) 
.on 'connection', (socket) -> 
    console.log "connected!" 

    socket.emit 'newMessage', {msg: "Hello!!", type: 1} 

    socket.on 'sendMessage', (data) -> 
     @io.sockets.in("/room").emit 'newMessage', {msg: "New Message!!", type: 0} 

客户

socket = io.connect '/' 

socket.of("/room") 
    .on 'connect_failed', (reason) -> 
    console.log 'unable to connect to namespace', reason 
.on 'connect', -> 
    console.log 'sucessfully established a connection with the namespace' 

socket.on 'newMessage', (message) -> 
    console.log "Message received: #{message.msg}" 

我的问题是,当我开始使用命名空间communi服务器和客户端之间的连接已停止工作。我没有找到任何类似于此的工作示例,所以我可能会做错事

回答

5

命名空间不在客户端上使用,就像它们在服务器端使用一样。您的客户端代码应该直接连接到命名空间路径,如下所示:

var socket = io.connect('/namespace'); 
socket.on('event', function(data) { 
    // handle event 
}); 

这就是说,名称空间与房间不同。命名空间在客户端连接,而客户端在服务器端连接。因此,该代码将无法正常工作:

io.sockets.in('/namespace').emit('event', data); 

你必须要么引用命名空间,还是从全球io对象调用它。

var nsp = io.of('/namespace'); 
nsp.emit('event', data); 

// or get the global reference 
io.of('/namespace').emit('event', data); 
+0

感谢您快速的答案,帮助我了解如何命名空间的工作,但我有问题,当我尝试授权连接到一个命名空间。我尝试从socket.io维基(https://github.com/LearnBoost/socket.io/wiki/Authorizing#namespace-authorization)中学习一个示例,并在发射/接收事件时失败。连接似乎是成功的,因为事件被触发为“连接”,并且“成功建立与名称空间的连接”消息显示在客户端和服务器日志中 –

+0

正如您在服务器端看到的,我使用的是作为参数接收的套接字在'连接'事件。 在客户端,我使用与用于连接服务器相同的对象 –

+1

谢谢!现在一切正常。这个wiki有点混乱,我把一些代码从你那里拿走了! –