socket.io如何从客户端获取参数?

时间:2018-01-17 02:08:46

标签: javascript node.js sockets express socket.io

我在服务器端有以下代码:

var io = socket(server);

io.on('connection', function(socket){
    console.log('made socket connection with ID:', socket.id);
});

这是我的理解。

我们在服务器端创建一个套接字并将其(实例?)传递给io。然后,我们说io.on(' connection')就是说要听连接事件。我们还创建了一个回调函数,我们正在向它传递套接字。

我不了解回调函数(套接字)部分。我们在哪里通过套接字?在客户端我有这个

var socket = io.connect('http://localhost:4000');

我知道将建立一个连接并且它将开始监听但是我们如何以及在哪里从客户端调用该函数?

1 个答案:

答案 0 :(得分:1)

我们没有调用回调,所以我们没有传递任何东西。您无法从客户端调用服务器端功能。

回调由JavaScript的事件循环调用(并给出参数),由socket.io库的内部触发 - 更具体地说,据我所知,在Engine.io中:

Server.prototype.handshake = function (transportName, req) {
  ...
  self.emit('connection', socket);
  ...
};

这是通过Node的原生EventEmitter完成的,它允许您register a callback为事件(io.on('connection', function(socket) { ... }))和emit the event提供回调数据({{1} }})。与事件发射一起传递的数据是在发射器对象上为事件注册的任何回调接收的数据。

因此,流程大致如下:

  • 在Serverside中,您为Engine.io对象上的self.emit('connection', socket)事件注册了一个回调处理程序(由Socket.io的connection函数传递给您。)
  • 客户端,您调用socket函数。它启动Websocket请求。
  • Serverside,Engine.io接收Websocket请求。它创建一个connect对象来表示与该特定客户端的连接,然后发出socket事件,并将connection对象作为附带数据。
  • socket事件会导致为该事件注册的所有处理程序被调用,并传递随附的数据(connection对象),您的函数就在其中。