Socket.io回调函数参数困惑

时间:2015-11-12 22:53:35

标签: 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的事件来改变房间。)

总结一下,我对以下代码中的三个'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);
    });
 });

1 个答案:

答案 0 :(得分:4)

  

这里,代码创建了一个套接字服务器"附加"根据api参考与http服务器。什么是附件?

webSocket连接(其中socket.io构建在其上)通过首先建立HTTP连接从客户端启动。因此,必须有一个可用于socket.io连接的HTTP服务器。这就是为什么socket.io的初始化需要HTTP连接的原因。通常,该Web服务器也充当普通的Web服务器,因此可以用于这两个目的。这简化了跨源问题,因为所有浏览器都将所有客户端连接到其网页所在的相同源。如果您还没有其他网络服务器,socket.io可以创建自己的服务器。

  

问题:这里,' socket'变量是服务器或客户端?

服务器端对象表示与特定客户端的连接。 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并将其加入服务器上的特定会议室。