【问题标题】:Can't get Websockets / wss to work at all on simple app根本无法让 Websockets / wss 在简单的应用程序上工作
【发布时间】:2021-08-04 05:02:36
【问题描述】:

过去几天我一直在摆弄 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'));

【问题讨论】:

    标签: javascript node.js express websocket wss


    【解决方案1】:

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

    阅读此implementing-https-and-wss-support-in-express您可能会有一个想法

    【讨论】:

      猜你喜欢
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多