为什么我们在nodejs上的javascript中将http服务器传递给websocket实例?

haw*_*exp 2 http websocket node.js ws

类似的代码究竟 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 服务器?

jfr*_*d00 5

所有 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)上运行。

一些相关参考:

为什么WebSocket“握手后”可以与HTTP共享80端口?

websocket 实现内部使用 http 协议吗?

WebSocket 和普通套接字通信有什么区别?

socket.io 的工作原理

通过http建立websocket协议连接的示例