我不确定我是否理解套接字的服务器端配置。
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”变量是服务器的还是客户端的?如果它是服务器的那么为什么 socket.join(room) 有效? (客户端已添加到房间)如果是客户端的,那么为什么它必须监听“create”事件。(客户端发出一个名为 create 的事件来更改房间。)
总而言之,我对以下代码中的三个“套接字”感到困惑。
socketio.on('connection', function (socket) {
socket.on('create', function(room) {
console.log('joining a room');
socket.join(room);
console.log('socket joined room: ', room);
});
});
最佳答案
Here, the code creates a socket server "attached" with the http server according to the api reference. What is attach?
webSocket 连接(socket.io 构建于其之上)都是通过首先建立 HTTP 连接从客户端发起的。因此,必须有一个可用于socket.io 连接的HTTP 服务器。这就是为什么socket.io的初始化需要HTTP连接。通常,该 Web 服务器也充当普通 Web 服务器,因此可以用于这两个目的。这简化了跨源问题,因为所有浏览器和所有客户端都连接到为其网页提供服务的同一源。如果您还没有另一个 Web 服务器,socket.io 可以创建它自己的服务器。
Question: Here, the 'socket' variable is server's or client's ?
它是服务器端对象,表示与特定客户端的连接。 Socket.io 在客户端上有一个套接字对象,表示与服务器的客户端连接,在服务器上(对于每个单独的客户端连接)也有一个套接字对象,表示与特定客户端的连接。
因此,如果您想将数据发送到特定客户端,您可以使用 socket
代表该客户的对象,而您则执行以下操作:
socket.emit(msg, data);
if it is server's then why the socket.join(room) works ?
这有效是因为 socket
对象表示与特定客户端的连接。它是一个服务器端对象,但它特定于特定客户端(例如,每个客户端连接都有一个不同的对象)。
to conclude, I confused by the three 'socket' in the following code.
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
如上所述,并将其加入到服务器上的特定房间。
关于node.js - Socket.io回调函数参数混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33682960/