https - 如何在 ws 和 wss 上运行 websocket 服务器,同时它们彼此通信或同步数据?还是 HTTP 上的 WSS 和 HTTPS 上的 WS?
问题描述
我的要求是,如果某些用户通过WS 或 WSS连接,他们可以相互通信。现在,如果我为WSS运行节点服务器,它不会通过HTTP运行,如果为WS运行,那么它不会在HTTPS上连接。任何解决方案?
解决方案
经过长时间的研究,我终于找到了这个解决方案,并按照我的要求为我工作。这是我的 sever.js 文件。
/**
Before running:
> npm install ws
Then:
> node server.js
> open http://localhost:8080 in the browser
*/
const http = require('http');
const fs = require('fs');
const ws = new require('ws');
//for wss
const https = require('https');
const options = {
key: fs.readFileSync('key.pem'),
cert: fs.readFileSync('cert.pem')
};
const wss = new ws.Server({noServer: true});
const clients = new Set();
function accept(req, res) {
if (req.url == '/ws' && req.headers.upgrade &&
req.headers.upgrade.toLowerCase() == 'websocket' &&
// can be Connection: keep-alive, Upgrade
req.headers.connection.match(/\bupgrade\b/i)) {
wss.handleUpgrade(req, req.socket, Buffer.alloc(0), onSocketConnect);
} else if (req.url == '/') { // index.html
fs.createReadStream('./index.html').pipe(res);
} else { // page not found
res.writeHead(404);
res.end();
}
}
function onSocketConnect(ws) {
clients.add(ws);
log(`new connection`);
ws.on('message', function(message) {
log(`message received: ${message}`);
message = message.slice(0, 500); // max message length will be 50
for(let client of clients) {
client.send(message);
}
});
ws.on('close', function() {
log(`connection closed`);
clients.delete(ws);
});
}
let log;
if (!module.parent) {
log = console.log;
// for wss
https.createServer(options,accept).listen(8443);
http.createServer(accept).listen(8080);
} else {
// to embed into javascript.info
log = function() {};
// log = console.log;
exports.accept = accept;
}
现在 WS 和 WSS 链接将从同一个文件运行。对于 WSS 端口将是 8443,对于 WS 8080,其他链接将保持不变。对于 WSS,这些是必需的
键:fs.readFileSync('key.pem'),
证书:fs.readFileSync('cert.pem')
这是生成这些文件的帮助
//如何从密钥和crt文件中获取pem文件
如何从 .key 和 .crt 文件中获取 .pem 文件?
openssl rsa -inform DER -outform PEM -in server.key -out server.crt.pem
如果遇到任何问题,请告诉我。
推荐阅读
- javascript - 在 JavaScript 中访问更新表单的元素
- windows - 将第二个文件扩展名添加到具有特定前缀的文件
- docker - 如何安装 libsnappy.so.1?
- mysql - 如何在没有聚合函数的情况下按共同值分组并获取所有不同的值
- excel - 提示用户从某个位置选择文本文件
- java - java 中名为 charAt() 的方法不起作用?
- ios - 尝试运行项目时出现“没有这样的模块”错误
- python - 熊猫指定行格式
- schema.org - 用于不同 Schema.org 类型的多个 JSON-LD 脚本:为什么在使用 Google SDTT 进行测试时将它们组合为一种类型?
- .htaccess - 文件夹作为变量?