【问题标题】:Why heroku can't run WebSocket server without HTTP server?为什么 heroku 不能在没有 HTTP 服务器的情况下运行 WebSocket 服务器?
【发布时间】:2017-08-18 22:43:22
【问题描述】:

我在 heroku 上有一个 WebSocket 应用程序。我尝试在不路由 http 服务器的情况下上传我的 WebSocket 应用程序,但它不起作用。 服务器路由是什么意思?为什么 heroku 不能在没有 http 服务器的情况下运行 WebSocket 服务器? 以及为什么在 SocketServer 中使用 express object 'server' 作为参数 这是我的 Websocket 服务器代码。

const express = require('express');
const SocketServer = require('ws').Server;
const path = require('path');

const PORT = process.env.PORT || 3000;
const INDEX = path.join(__dirname, 'index.html');

const server = express()
  .use((req, res) => res.sendFile(INDEX) )
  .listen(PORT, () => console.log(`Listening on ${ PORT }`));

const wss = new SocketServer({ server });
wss.on("connection",function(ws){
    ws.on("message",function(message){
        if(message==='exit'){
            ws.close();
        }else{
            wss.clients.forEach(function(client){
                client.send(message);    
            });
            console.log(message);
        }
    });
    ws.send("welcome..");
});

【问题讨论】:

  • Websockels 是通过 HTTP 设置的。没有它们你就不能使用它们。
  • 是的,但实际上在 SocketServer 中传递 express 对象时后端会发生什么
  • 并且在 localhost 中它可以在没有路由 http 服务器的情况下正常工作。
  • @mehul 我的回答没有帮助吗?如果是,请为它投票。
  • 是的,我那天只试过,但它说“感谢您的反馈!声望低于 15 人的投票将被记录,但不要更改公开显示的帖子分数”

标签: javascript node.js heroku


【解决方案1】:

一个问题太多了。我希望我的回答能解决所有这些问题。

首先,websocket协议是http的扩展,并没有什么不同。因此,即使具有扩展功能,websocket 服务器也必然是 http 服务器。

此外,对于 socket.io,websockets 和 http 在同一个端口上运行。因此,您必须为 http 打开端口才能让您的 websockets 工作。

让我们看看这一行:

const wss = new SocketServer({ server });

它有一个语法错误,它必须是new SocketServer(server)。另外,关于变量名,我建议不要将wss 用于 http 上的 websocket,因为 wss 代表 secure websockets 并且与 websockets 有关 喜欢 httphttps

关于heroku 中的路由:在heroku 中,您必须定义您的应用程序正在使用哪个端口。这可以比作本地机器上的防火墙:如果你想从外部访问它,你必须打开端口。在 heroku 上,从技术上讲,它与防火墙不同,但在这一点上是相似的。

【讨论】:

    猜你喜欢
    • 2012-06-19
    • 2014-03-26
    • 1970-01-01
    • 2012-04-15
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多