node.js - Socket.io回调函数参数混淆

标签 node.js websocket socket.io yeoman

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

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/

相关文章:

node.js - 对 Socket.io 和 Express.js 之间的关系感到困惑

node.js - 在 Express 中对路线进行分组

node.js - 如何在 Mongoose 查询中设置限制、偏移、跳过

javascript - 删除不适用于 NodeJs 中的 javascript 对象

java - 在 Java 中实现 WebSocket

java - 使用 Netty 的 WebSockets 上的 MQTT?

javascript - Node-chat 使用什么样的技术

javascript - 使用 socket.io 和 nodejs 向连接的客户端发送持续更新

javascript - WebRTC视频聊天

node.js - socket.io + 使用 'emit' 回调?