2015-11-12 94 views
0

我不确定我了解套接字的服务器端配置。Socket.io回调函数参数混淆

var app = express(); 
var server = require('http').createServer(app); 
var socketio = require('socket.io')(server, { 
    serveClient: config.env !== 'production', 
    path: '/socket.io-client' 
}); 

这里,代码根据api引用创建一个与http服务器“连接”的套接字服务器。什么是附加?

socketio.on('connection', function (socket) { 
    socket.on('create', function(room) { 
     console.log('joining a room'); 
     socket.join(room); 
     console.log('socket joined room: ', room); 
    }); 

    socket.address = socket.handshake.address !== null ? 
     socket.handshake.address.address + ':' + socket.handshake.address.port : 
     process.env.DOMAIN; 

    socket.connectedAt = new Date(); 

    // Call onDisconnect. 
    socket.on('disconnect', function() { 
     onDisconnect(socket); 
     console.info('[%s] DISCONNECTED', socket.address); 
    }); 

    // Call onConnect. 
    onConnect(socket); 
    console.info('[%s] CONNECTED', socket.address); 
    }); 
}; 

问题:在这里,'套接字'变量是服务器还是客户端?如果它是服务器的话,为什么socket.join(房间)工作? (客户端被添加到一个房间)如果是客户端,那么为什么它必须听'创建'事件(客户端发出一个名为create的事件来改变房间)。

来结束,我被三个'socket'在下面的代码中。

socketio.on('connection', function (socket) { 
    socket.on('create', function(room) { 
     console.log('joining a room'); 
     socket.join(room); 
     console.log('socket joined room: ', room); 
    }); 
}); 

回答

4

这里,代码创建一个套接字服务器根据所述API参考“附接”与HTTP服务器。什么是附加?

WebSocket连接(这socket.io是建立在顶部)都得到首先做一个HTTP连接从客户端发起的。因此,必须有一个可用于socket.io连接的HTTP服务器。这就是为什么socket.io的初始化需要HTTP连接的原因。通常情况下,该Web服务器也充当普通Web服务器,因此可用于这两个目的。这简化了跨源问题,因为所有浏览器都将所有客户端连接到其网页所服务的同一个来源。如果你还没有其他的web服务器,socket.io可以创建它自己的。

问题:在这里,'套接字'变量是服务器还是客户端?

它是表示到特定客户端的连接的服务器端对象。 Socket.io在客户端上有一个套接字对象,表示到服务器的客户端连接,并且在服务器上有一个套接字对象(用于每个单独的客户端连接),用于表示与特定客户端的连接。

所以,如果你想将数据发送到特定的客户端,您使用socket对象,表示该客户端,你做的事:

socket.emit(msg, data); 

如果是服务器那么为什么socket.join(房间)的作品?

这是可行的,因为socket对象表示与特定客户端的连接。它是一个服务器端对象,但它是特定于特定客户端的(例如,每个客户端连接有不同的对象)。

总结,我在下面的代码中被三个'套接字'弄糊涂了。

socketio.on('connection', function (socket) { 
    socket.on('create', function(room) { 
     console.log('joining a room'); 
     socket.join(room); 
     console.log('socket joined room: ', room); 
    }); 
}); 

socketio代表整体socket.io模块是如何执行全局命令。在这种情况下,您正在执行全局命令来侦听新连接的客户端。

当您收到connection事件时,该事件的参数是新创建的socket对象(表示与特定客户端的连接的服务器端对象)。

socket.on('create', ...)是从客户端发送到服务器的create消息的侦听器。因此,这行代码表示要监听从这个特定的(新连接的)客户端发送的create消息,并且当该消息到达时,调用回调并将与消息一起发送的数据(本例中为房间名称)传递给它。

socket.join(room);行使用与上面相同的socket并将其连接到服务器上的特定空间。

+0

非常感谢!你的解释很棒! –