[英]Express and Websocket to run on the same port on the same file
我正在运行两个应用程序,它们使用 websocket 相互发送实时消息,还使用 express.js 生成随机链接,现在我将服务器与两个反应应用程序托管到我的 vps 主机,并希望使 websocket 连接安全( wss://) 但我意识到我也必须在同一个端口上获得快速服务器,所以 ssl/tsl 对两者都有效——那么我该怎么做呢?
这是我的完整代码,都在同一个文件中:
const webSocketServerPort = 8000;
const webSocketServer = require('websocket').server;
const http = require('http');
const server = http.createServer(); server.listen(webSocketServerPort); console.log('Listening on port 8000');
const wsServer = new webSocketServer({ httpServer: server })
//GEERTOOOO
const express = require('express'); const cors = require('cors'); const fs = require('fs'); const app = express();
app.use(cors({ origin: '*' }));
app.get('/', (req, res) => { // Generate a random 6-character string const linkId = Math.random().toString(36).substr(2, 6);
// Save the link in the lex.json file fs.readFile('lex.json', (err, data) => { if (err) { console.error(err); res.status(500).send('Error generating link'); return; }
const links = JSON.parse(data);
links[linkId] = {
destination: 'http://localhost:4000/',
expires: Date.now() + 1000 * 60 * 5 // expires in 5 minutes
};
fs.writeFile('lex.json', JSON.stringify(links), (err) => {
if (err) {
console.error(err);
res.status(500).send('Error generating link');
return;
}
// Send the link back to the client
res.send(`http://localhost:3000/${linkId}`);
});
}); });
app.get('/:linkId', (req, res) => {
fs.readFile('lex.json', (err, data) => {
if (err) { console.error(err); res.status(500).send('Error retrieving link');
return;
}
const links = JSON.parse(data);
const link = links[req.params.linkId];
if (!link) {
res.status(404).send('Link not found');
return;
}
// Check if the link has expired
if (link.expires < Date.now()) {
res.status(410).send('Link has expired');
return;
}
// Redirect to the destination
res.redirect(link.destination);
}); });
app.listen(3000, () => { console.log('Server listening on port 3000'); });
//GEERTOOOO
const clients = {};
const getUniqueID = () => { const s4 = () => Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
return s4() + s4() + '-' + s4(); }
wsServer.on('request', (request) => { var userID = getUniqueID();
const connection = request.accept(null, request.origin); clients[userID] = connection;
connection.on('message', (message) => {
if (message.type === 'utf8') {
for(var key in clients) {
if (clients[key] !== clients[userID]) {
clients[key].sendUTF(message.utf8Data);
console.log(`Sent Message to: ${clients[key]}`);
}
}
}
}) })
注意:express 服务器在端口 3000 上,而 websocket 服务器在端口 8000 上运行。
我尝试过将端口更改为相同的东西,但在尝试使用 websocket 服务器接收消息时出现错误。
所有这一切的目的只是为了使 WEBSOCKET 连接和快速连接安全,以便我的应用程序(使用 letsencrypt ssl)可以连接到服务器
不可能创建两个单独的服务器实例,它们都在同一个端口上侦听。 但是,特别是对于 webSocket,您可以在 Express 和 webSocket 服务器代码之间共享一个服务器实例。 这是可能的,因为 webSocket 连接总是以 http 请求开始(因此可以使用您的 Express http 服务器侦听它。并且,因为发起 webSocket 的这些 http 请求都包含标识标头,它们可以从常规 1822244 请求中分离出来对于 Express,通过查看标题。webSocket 服务器代码已经知道如何为您执行此操作。
为此,首先捕获 Express 服务器实例:
const server = app.listen(3000, () => { console.log('Server listening on port 3000'); });
然后,在创建 webSocket 服务器时使用该server
实例。
const wsServer = new webSocketServer({ httpServer: server });
然后,删除此代码,因为您不想为 webSocket 服务器创建另一个 http 服务器实例:
const server = http.createServer();
server.listen(webSocketServerPort);
console.log('Listening on port 8000');
您通常不能在同一个端口上侦听两个不同的服务(有关此的更多信息,请参阅此问题)。
您接下来可以做什么有几个选项。 一种选择是在受保护的端口上运行一项服务,该服务接受对您的其他两个服务的请求,然后将它们重定向到这些端口(充当代理)。 另一种选择是保护两个端口,如果目前这太困难,可能会通过不同的方法。 第三种选择是将所有不同的端点移动到一个服务中,尽管从架构的角度来看这可能不明智。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.