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



全部:

我对Socket.io还很陌生,现在正在学习如何使用Socket.io和Express.js构建实时聊天应用程序,有一个问题总是让我很困惑:

Socket.io和Express.js之间的关系是什么?

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
server.listen(80);
app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});
io.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

我试图把socket.io看作一个库,提供一个新的通信协议处理程序,就像Express一样,可以处理http和https。但是为什么socket.io需要绑定到Express服务器才能工作,就像代码中一样:

var io = require('socket.io')(server);

有人能告诉我整个初始化过程中发生了什么吗:

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
server.listen(80);

感谢

每个socket.io/webSocket连接都以HTTP请求开始。因此,任何webSocket服务器支持都需要一个可以发送初始请求的HTTP服务器。该初始请求包含一个"升级"标头,这是一个切换到webSocket协议的请求,因此在处理之后,传入的HTTP/TCP连接将变为webSocket/TCP连接。

因此,由于webSockets旨在与您的Web服务器共存,甚至使用相同的传入端口(使webSocket请求成为相同的原始请求并使用默认端口80(,这意味着webSocket要求与您的常规HTTP要求到达完全相同的端口和完全相同的服务器,因此为了支持该场景,socket.io必须与您的web服务器(在本例中为Express(集成,以便socket.io可以在Express http服务器中安装一个处理程序,以便任何恰好是传入socket.io连接的传入http请求都将由socket.io代码处理,而不是由其他Express处理程序处理。

仅供参考,socket.io不必有Express。如果由自己配置,它将创建自己的HTTP服务器,但这样做需要HTTP服务器位于与web服务器不同的主机或端口上,这通常不是所需的配置。

因此,socket.io可以通过多种方式进行配置。您可以将您的Express实例传递给它,在这种情况下,它将向Express添加一个请求处理程序。您可以向它传递一个普通的http服务器,在这种情况下,它将向该服务器添加一个请求处理程序,或者您可以向其传递一个端口号,它将创建自己的http服务器。在所有情况下,它都需要一个http服务器来支持传入的socket.io/webSocket连接。

相关内容

  • 没有找到相关文章

最新更新