类似代码的确切含义是什么
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 服务器?
2 回答
所有 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 连接通常Upgrade
来自 HTTP 连接。HTTP 服务器处理与客户端的完整握手,然后将其他所有内容委托给 WebSocket。有关这方面的更多信息,请参阅协议升级机制。