Socket.io 回调函数参数混淆

Socket.io Callback Function Parameter Confused

我不确定我是否理解套接字的服务器端配置。

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服务器创建了一个socket服务器"attached"。什么是附加?

 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 的事件来更改房间。)

总而言之,我被下面代码中的三个'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);
    });
 });

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 并将其连接到服务器上的特定房间。