我有一个带有websockets的https expressjs服务器(使用“ ws”包)。据我了解套接字和端口,我应该能够在websocket连接旁边添加一条路由。主要用例是使服务器可以卷曲(我在网上看到的所有ws curl请求都不起作用)。
不幸的是,我只有1个端口用于服务器和Websocket。我该如何设置,以便 app 和服务器都可以在同一端口上监听?
我已经在SO上看到了一些注释,表明可以做到这一点,但没有代码示例,或者是针对非常不同的软件包的。
我正在使用'ws'软件包:https://www.npmjs.com/package/ws
const port = 8888;
const http = require('http');
const https = require('https');
const express = require('express');
const websocket = require('ws');
const app = express();
app.use( express.static('public') );
app.get('/curl', (req, res) => res.send('Hello World')).listen( port );
const httpsServer = https.createServer( credentials, app );
const wss = new websocket.Server({ server: httpsServer });
httpsServer.listen( port, function listening(){
console.log( 'listening on ' + port );
});
由于我将相同的端口用于两个“服务器”,因此当前出现“ EADDRINUSE”错误。
跟进
答案 0 :(得分:1)
您的代码显示您试图在同一端口上启动两个服务器。
此行创建一个新的http服务器,并尝试在端口8888上启动它:
app.get('/curl', (req, res) => res.send('Hello World')).listen( port );
这些行将创建一个新的https服务器,并尝试在端口8888上启动它。
const httpsServer = https.createServer( credentials, app );
httpsServer.listen( port, function listening(){
console.log( 'listening on ' + port );
});
您不能那样做。如果您只想让一个https服务器既可用于Web请求又可用于webSocket(一种常见的处理方式),则将代码更改为此:
const port = 8888;
const https = require('https');
const express = require('express');
const websocket = require('ws');
const app = express();
app.use( express.static('public') );
app.get('/curl', (req, res) => res.send('Hello World'));
const httpsServer = https.createServer( credentials, app );
const wss = new websocket.Server({ server: httpsServer });
httpsServer.listen( port, function listening(){
console.log( 'listening on ' + port );
});
仅删除在.listen(port)
对象上运行的app
,因为这将创建一个http服务器并在8888端口上启动它。