【问题标题】:Why do we pass an http server to a websocket instance in javascript on nodejs?为什么我们在 nodejs 上的 javascript 中将 http 服务器传递给 websocket 实例?
【发布时间】:2020-01-12 16:46:34
【问题描述】:

代码到底是什么 var WebSocketServer = require("ws").Server, express = require("express"), http = require("http"), app = express(), server = http.createServer(app); var wss = new WebSocketServer({server: server}); 是什么意思?那到底在做什么?为什么需要给 websocket 服务器一个 http 服务器?

【问题讨论】:

    标签: node.js http websocket ws


    【解决方案1】:

    所有 webSocket 连接都以来自客户端的 http 请求(包含 upgrade 标头)开始。一旦双方同意升级到 webSocket 协议是可行的并且交换了一些安全凭证,那么协议就会升级到 webSocket 协议,并且该套接字上的所有未来通信都使用 webSocket 协议,而不是 http 协议。

    但是,每个 webSocket 服务器都必须是用于 webSocket 启动过程的 http 服务器。

    您可以选择是否希望此 http 服务器成为共享的 http 服务器,同时也用于您自己的 http 请求,或者是否希望为 webSocket 连接创建单独的 http 服务器。如果您使用单独的 http 服务器,则它必须位于单独的端口上(因为您不能在同一主机上让两台服务器在同一端口上运行)。

    当使用共享 http 服务器时,有一个小的 webSocket 监听器会检查每个传入的 http 请求。如果该传入请求包含 Upgrade: websocket 标头,则它将接管该传入请求。如果没有,它会让常规的 http 服务器逻辑将请求作为普通的 http 请求来处理。通过这种方式,同一个 http 服务器可以同时用于 http 请求和传入的 websocket 连接请求。

    因此,通过与 http 服务器共享,一切(您的 http 请求和 webSocket 连接)都可以在通常的默认端口上运行,端口 80(用于 http)或端口 443(用于 https)。

    一些相关参考资料:

    Why WebSocket can share the 80 port with HTTP "after the handshake"?

    Do websocket implementations use http protocol internally?

    What's the difference between WebSocket and plain socket communication?

    How socket.io works

    Examples of establishing a websocket protocol connection over http

    【讨论】:

    • 感谢您的出色回答。如果我可能会问,SockJS 和 websockets 通过 ws 之类的东西有什么区别? SockJS 不仅仅是 websockets 吗?
    • @hawexp - sockJS 是一个更高级别的层,可以在 webSockets 之上运行,增加了一些功能(与 socket.io 相同的一般概念)。您可以阅读有关 socketJS 的更多信息以了解它提供的内容。我个人对 socket.io 比对 sockJS 更熟悉。
    【解决方案2】:

    这是因为 WebSocket 连接通常是来自 HTTP 的Upgrade。 HTTP 服务器处理与客户端的完整握手,然后将其他所有内容委托给 WebSocket。有关更多信息,请参阅Protocol upgrade mechanism

    【讨论】:

    • 那么传递http服务器实例是可选的吗?做比不做有什么好处?
    • 根据此处的文档:github.com/websockets/ws 是的,这是可选的。我想选择取决于您是否需要为您的服务使用 HTTP
    猜你喜欢
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 2014-06-07
    相关资源
    最近更新 更多