无法让 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
过去几天我一直在摆弄 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