为什么我们将 http 服务器传递给 nodejs javascript 中的 websocket 实例?
Why do we pass an http server to a websocket instance in javascript on nodejs?
代码到底是什么
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 服务器?
这是因为 WebSocket 连接通常是来自 HTTP 的 Upgrade
。 HTTP 服务器处理与客户端的完整握手,然后将其他一切委托给 WebSocket。有关这方面的更多信息,请参阅 Protocol upgrade mechanism。
所有 webSocket 连接都以来自客户端的 http 请求开始(包含 upgrade
header)。一旦双方同意升级到 webSocket 协议并交换了一些安全凭证,协议就会升级到 webSocket 协议,并且该套接字上的所有未来通信都使用 webSocket 协议,而不是 http 协议。
但是,每个 webSocket 服务器都必须是 webSocket 启动过程的 http 服务器。
您可以选择是否希望此 HTTP 服务器成为也用于您自己的 HTTP 请求的共享 HTTP 服务器,或者是否希望为 webSocket 连接创建单独的 HTTP 服务器。如果您使用单独的 http 服务器,那么它必须在一个单独的端口上(因为您不能在同一主机上有两个服务器在同一端口上运行)。
使用共享 http 服务器时,有一个小型 webSocket 侦听器会检查每个传入的 http 请求。如果该传入请求包含 Upgrade: websocket
header,则它将接管该传入请求。如果不是,它会让常规的 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?
Examples of establishing a websocket protocol connection over http
代码到底是什么
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 服务器?
这是因为 WebSocket 连接通常是来自 HTTP 的 Upgrade
。 HTTP 服务器处理与客户端的完整握手,然后将其他一切委托给 WebSocket。有关这方面的更多信息,请参阅 Protocol upgrade mechanism。
所有 webSocket 连接都以来自客户端的 http 请求开始(包含 upgrade
header)。一旦双方同意升级到 webSocket 协议并交换了一些安全凭证,协议就会升级到 webSocket 协议,并且该套接字上的所有未来通信都使用 webSocket 协议,而不是 http 协议。
但是,每个 webSocket 服务器都必须是 webSocket 启动过程的 http 服务器。
您可以选择是否希望此 HTTP 服务器成为也用于您自己的 HTTP 请求的共享 HTTP 服务器,或者是否希望为 webSocket 连接创建单独的 HTTP 服务器。如果您使用单独的 http 服务器,那么它必须在一个单独的端口上(因为您不能在同一主机上有两个服务器在同一端口上运行)。
使用共享 http 服务器时,有一个小型 webSocket 侦听器会检查每个传入的 http 请求。如果该传入请求包含 Upgrade: websocket
header,则它将接管该传入请求。如果不是,它会让常规的 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?
Examples of establishing a websocket protocol connection over http