【问题标题】:socket.io in existing node.js project现有 node.js 项目中的 socket.io
【发布时间】:2019-08-28 11:15:55
【问题描述】:

我希望在具有 node.js 后端的应用程序中实现实时更新。我想为此使用socket.io,并且我了解需要实现的库。但是,我已经运行了一个 node.js 服务器:

app.listen(process.env.PORT, () => {

    console.log("Server is up and running")

})

问题很简单:是否可以使用具有相同端口的同一服务器来侦听 socket.io 连接,或者我应该完全在不同的服务器上运行它还是为此打开另一个端口?因为我在例子中经常看到的是它监听http。见下文。

平时看到的(本例来自this post

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

http.listen(3000, function () {
    console.log('listening on *:3000');
});

现在,如果我要使用相同的服务器和端口,我怎么还能监听传入的 socket.io 请求或发送给它的客户端?我可以继续用 app.listen 听,它还会连接到 socket.io 吗?

【问题讨论】:

    标签: node.js express socket.io


    【解决方案1】:

    简而言之,套接字连接以相同地址和端口的 http 请求开始。

    WebSocket 协议旨在与现有的 Web 基础设施。作为该设计原则的一部分,协议 规范定义 WebSocket 连接的生命周期为 HTTP 连接,保证完全向后兼容 WebSocket 之前的世界。从 HTTP 到 WebSocket 的协议切换是 称为 WebSocket 握手。

    此时,HTTP 连接中断并由 通过同一底层 TCP/IP 连接的 WebSocket 连接。这 WebSocket 连接使用与 HTTP (80) 和 HTTPS (443) 相同的端口, 默认情况下。

    https://websocket.org/aboutwebsocket.html

    【讨论】:

    • 还会推荐吗?我的意思是,它会在性能等方面缩小尺寸吗?我在 node.js 中有一个带有常规 GET/POST 请求的基本应用程序,用于从我的 MySQL 数据库中检索数据。然后,我将使用 socket.io 向用户发送实时更新(通知),在稍后阶段,我想实现在另一个数据库(可能是 MongoDB)上运行但连接到同一服务器的实时聊天,这就是为什么我想在同一个基础架构中实现这两者:目前由一台服务器处理我的所有请求。
    • 您可以在不同的端口上运行它,但它将作为 HTTP 服务器运行,该服务器将解析与 websocket 的连接,因此如果它们在同一个机器上运行,则在性能方面没有任何好处,特别是因为他们都使用 NodeJS,所以 websocket 服务器将使用相同的底层技术(以及资源​​)。
    • 有道理。当大量流量进入时,我可以想象将它们分成两个不同的系统,各自分配 RAM/CPU/内存,这将是提高性能的最佳选择。但是,在这个阶段我不太关心基础设施(但保留所有进一步扩展的选项),因为我首先想验证我的概念证明。你能说明我如何开始在同一个端口上使用 socket.io 进行监听吗?我昨天试过了,但基本上是因为我在同一个端口(app.listen 和 http.listen)上听了两次而出错。
    • 是的,具有两个服务器的单个服务器在需要扩展之前应该可以轻松处理大量流量。您写的内容已经正确,您也不需要app.listen。在后台app.listen 只是创建一个http 服务器并通过app 路由流量,这是一件方便的事情。自己创建 http 服务器会更好,因为您拥有更多控制权(例如,轻松地将其与 https 服务器交换)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 2011-09-29
    相关资源
    最近更新 更多