【问题标题】:Expressjs app, using websockets for chat. Use different port for websocket server?Expressjs 应用程序,使用 websockets 进行聊天。为 websocket 服务器使用不同的端口?
【发布时间】:2017-03-03 05:23:37
【问题描述】:

我正在使用 node.js 的 express 框架制作一个应用程序,该框架通过 http 提供 html 内容并使用 websockets 进行聊天功能。我想知道如何同时完成两者。我的想法是为 websocket 连接使用不同的端口(因此 http 请求将到达端口 3000,而 websockets 将连接到端口 3001)但我不知道这是否是一个好的解决方案。我特别担心部署到 heroku 之类的东西,以及是否可以为我的应用程序指定不同的端口。

【问题讨论】:

  • 唯一的方法是定义不同的端口。我真的建议为此制作两个不同的“应用程序”,它们可以相互依赖。您可以使用node foreman 同时运行这些服务。
  • 确实没有理由为 webSocket 连接使用单独的端口。 webSocket 协议是专门设计的,因此它可以轻松地与您的 Web 服务器共享端口。它的工作方式是所有 webSocket 连接都以一个 http 请求开始,并在请求上设置了几个特定的​​标头。这允许您的核心 Web 服务器分辨哪些传入连接是常规 Web 服务器请求,哪些是建立 webSocket 连接的请求。您不需要两个端口上的两台服务器。

标签: node.js express websocket port


【解决方案1】:

我想知道如何同时完成这两项工作。

webSocket 协议是专门设计的,因此它可以在与您的常规 Web 服务器请求相同的端口上运行。因此,您不需要单独的端口即可使用 webSockets 运行 Web 服务器和聊天。

这是可行的,因为 webSocket 连接总是由设置一些特殊标头的 http 请求启动。然后,接收 Web 服务器可以检测到这些特殊的标头,并知道这个传入的 http 请求实际上是一个发起 webSocket 连接的请求。通过特定的响应,客户端和服务器然后同意“升级”连接并切换到 webSocket 协议。从那时起,该特定 TCP 连接使用 webSocket 协议。

同时,任何没有特殊 webSocket 标头的传入 http 请求都会被您的 Web 服务器视为常规 http 请求。这样,同一个服务器和同一个端口既可以用于 webSocket 连接,也可以用于常规的 http 请求。不需要第二个端口。

此方案的另一个优点是客户端可以避免跨域问题,如果它尝试使用与加载它的网页不同的端口。


我特别担心部署到 heroku 和 如果我可以为我的应用指定不同的端口。

如果您要实际使用两个端口,那么您需要创建两个单独的服务器,一个监听每个端口,因为给定的服务器只能监听一个端口。在 node.js 中,两个服务器可以都在同一个 node.js 应用程序中(更容易在它们之间共享数据),或者您可以将它们放在完全独立的 node.js 进程中(您的选择)。

而且,如果您使用多个端口,您还必须支持 CORS,以便允许浏览器连接到单独的端口(以避免同源限制)。

【讨论】:

  • 你有这方面的代码示例吗?我有同样的用例。
  • @Karric - 任何服务器端 webSocket 或 socket.io 库都会向您展示如何将其连接到现有 Web 服务器的示例。例如,这个页面socket.io/get-started/chat 展示了如何使用 socket.io 来实现。 This 展示了如何使用 webSocket 库。
猜你喜欢
  • 1970-01-01
  • 2012-11-16
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 2015-08-18
相关资源
最近更新 更多