📌  相关文章
📜  你能在 https 上运行 websocket (1)

📅  最后修改于: 2023-12-03 14:49:35.171000             🧑  作者: Mango

你能在 https 上运行 WebSocket

WebSocket 是一种新型的通信协议,在网络通信中得到广泛应用。与传统的 HTTP 请求-响应协议不同,WebSocket 允许浏览器与服务器建立长连接,实现双向通信。通过 WebSocket,客户端可以向服务器发送消息,而服务器也可以主动向客户端推送消息。同时,WebSocket 也具有低延迟、高速率等优点,因此被广泛应用在实时通信、游戏、在线编辑等领域。

在实际场景中,为保证通信的安全性,我们经常会将网站的访问协议从 HTTP 转换为 HTTPS,也就是通过 SSL/TLS 加密传输数据。那么,在 HTTPS 协议下,如何使用 WebSocket 实现双向通信呢?接下来,我们将介绍两种方式,建立 WebSocket连接并实现双向通信。

方式一:使用 WSS

WSS 是 WebSocket over SSL/TLS 的缩写,也就是基于 SSL/TLS 加密实现的 WebSocket。与使用 HTTP 时建立 WebSocket 连接相同,使用 HTTPS 时,需要使用 WSS 协议,其端口号为 443。下面是 WSS 的连接地址样例:

wss://example.com:443/ws

在代码实现WebSocket连接时,我们只需要将 WebSocket 的 URL 地址设置为 WSS 的 URL 地址即可。比如在 JavaScript 中,可以这样实现:

const socket = new WebSocket('wss://example.com:443/ws');
方式二:使用 HTTP 代理

除了直接使用 WSS 协议之外,我们还可以使用 HTTP 代理实现 WebSocket over HTTPS。也就是说,我们可以在 HTTPS 连接上建立 HTTP 代理连接,再使用 HTTP 代理连接建立 WebSocket 连接。这种方式需要借助第三方库来实现,比如使用 sockjs-clientsockjs-node 库,实现代码如下:

import { SockJS } from 'sockjs-client';
const sock = new SockJS('/proxy', null, {
  transports: ['xhr-polling'],
  headers: {
    Host: 'example.com'
  },
  secure: true
});

const socket = new WebSocket('wss://example.com:443/ws');

sock.addEventListener('open', () => {
  socket.addEventListener('message', (event) => {
    sock.send(event.data);
  });
});

sock.addEventListener('message', (event) => {
  socket.send(event.data);
});

上述代码先使用 SockJS 建立 HTTP 代理连接,然后在 HTTP 代理连接上再建立 WebSocket 连接,并通过代理连接实现 WebSocket 的双向通信。

注意,使用 HTTP 代理建立 WebSocket 连接需要保证代理服务器支持协议转发。同时,使用 HTTP 代理建立 WebSocket 连接会使得连接时延增加,因为需要建立三层连接。

综上所述,我们可以通过以上两种方式,在 HTTPS 环境下正常使用 WebSocket 实现双向通信。如果注册的 WebSocket 服务商隐藏了实现方式,或者用了认证,那就很难确定应该如何实现,需要参考相关的文档或者咨询该服务商的技术支持团队。