无法让 Websockets / wss 在简单的应用程序上工作

Can't get Websockets / wss to work at all on simple app

过去几天我一直在摆弄 WebSockets,并取得了一些成功。特别是,我能够让客户端通过“ws://localhost:8080”连接到服务器。然而,第二次我将其更改为“wss://localhost:8080”时,我的客户端无法再连接,WebSocket API 可以告诉我的最好结果是“哈哈,你有一个错误”,我不知道如何解决这个问题。我是用Microsoft Edge浏览器支持客户端,node.js/express搭建服务端。我一直在网上搜索答案,但收效甚微。我唯一的猜测是 Edge 干扰了我的 WebSocket 连接。总的来说,我的最终目标是解决我的一个程序中的另一个问题,其中“wss”连接工作了 2 周,然后突然没有了。任何帮助或见解将不胜感激。

更新:我通过 ngrok 公开“localhost:8080”让“wss”工作。然而,更奇怪的事情发生了——有一半时间,WebSocket 连接建立并且一切正常。但另一半——websocket 连接失败。我真的卡住了。

这里是一些相关的代码:

客户:

<!DOCTYPE html>
<html lang='en'>
    <head>
        <meta charset='UTF-8'>
        <meta name="viewport" content = "width-device-width, initial-scale-1.0">
        <title>Socket Thing 1</title>
    </head>
    <body>
        Client1
        <button
            onclick="sendMessage()">Send Msg</button>
    </body>
    <script>
        const socket = new WebSocket('wss://localhost:8080');

        socket.addEventListener('open', function (event) {
            console.log('Connected to Web Socket server');
        });

        socket.addEventListener('message', function (event) {
            console.log("Client 1 received new message from server");
        });

        socket.onerror = (event) => {
            console.error("Web Socket error observed: " + event);
        }

        const sendMessage = () => {
            socket.send('Hello from Client1');
        }
    </script>
</html>

服务器:

const express = require('express');
const app = express();
const server = require('http').createServer(app);
const WebSocket = require('ws');
const wss = new WebSocket.Server( { server });

wss.on('connection', ws => {
    console.log('New client connected');
    ws.send('Welcome new client');

    ws.on('message', message => {
        console.log('Received a message: ' + message);
        ws.send("Message from server: Got your message");
        wss.clients.forEach(function each(client) {
            // don't send to current ws client
            if (client !== ws && client.readyState === WebSocket.OPEN) {
              client.send(message); // send to all other clients
            }
          });
    });
});

app.get('/', (req, res) => res.send('Hello World!'));

server.listen(8080, () => console.log('Listening on port : 8080'));

您的服务器似乎无法满足通过 wss:// 传入的请求。 通过 ws:// 处理通信不同于 wss:// 。 为此,您必须让服务器知道您的证书和私钥所在的位置,以便开始与您的客户端进行安全通信。

读完这篇文章你可能会有一个想法implementing-https-and-wss-support-in-express