首页 > 解决方案 > socket.io 服务器是否需要连接到 http 服务器?

问题描述

我是第一次学习socket.io。我想启动一个简单的套接字服务器。我看到我在互联网上找到的每个例子都是这样的:

var http = require('http');
var fs = require('fs');

// Loading the index file . html displayed to the client
var server = http.createServer(function(req, res) {
    fs.readFile('./index.html', 'utf-8', function(error, content) {
        res.writeHead(200, {"Content-Type": "text/html"});
        res.end(content);
    });
});

// Loading socket.io
var io = require('socket.io').listen(server);

// When a client connects, we note it in the console
io.sockets.on('connection', function (socket) {
    console.log('A client is connected!');
});


server.listen(8080);

问题

我的问题的核心很简单:在这样的所有示例中,我看到 io 监听附加到现有的 http 服务器。

这是一个要求吗?如果是,为什么?websocket协议是通过http传输的吗?

用例

我的用例可能有点奇怪:我有一个必须保持运行的 vue 开发服务器,因为它提供实时重新加载等。它正在侦听端口 8080,它由 vue-cli-service 提供,所以我无法将其更改为附上一些东西。

另外,我有一个“手工制作”和实验性的 smtp 服务器,用 node.js 制作并在端口 25 上运行

我想使用 websocket 来允许我的 smtp 服务器“发布”和我的 Vue.js webapp 来“收听”。

最终目标:使用简单的 webgui 创建一个独立的 smtp-catch-all 系统,因此通过我的 smtp 发送的每封邮件都被“推送”到我的 webapp 中并且永远不会存储(也永远不会真正发送!)

鉴于此,我想创建一个“独立”的 socket.io 服务器。如果它只需要一个 http 服务器,我会在特定端口上创建第二个服务器以允许 http->websocket 升级;然后我的网络应用程序将简单地与这个辅助服务器上的套接字服务器通信。

我更喜欢这种方式,因为使用 pm2,我可以运行每个服务而无需接触另一个

标签: node.jswebsocket

解决方案


WebSocket 协议是一个单独的协议,它不是建立在 HTTP 之上的。然而,HTTP 协议本身有一种升级机制(即 WebSocket 握手),它将简单的 HTTP 连接转换为 WebSocket 连接。而且由于浏览器使用它,因此不可能从没有 HTTP 的浏览器建立 WebSocket 连接。

旁注: socket.io 也使用其他协议。如果 WebSocket 协议不可用,它会退回给他们。

现在以下(显然)是一种观点:没有必要将一台服务器连接到另一台服务器。事实上,这是一种反模式。您通常希望组件尽可能独立,以便对一个组件的更改不会影响另一个组件。此外:即使两者都通过 HTTP 运行,仍然没有理由这样做。我发现这些教程至少具有误导性。


推荐阅读