【问题标题】:NodeJS and socket.io app on Heroku with 2 portsHeroku 上带有 2 个端口的 NodeJS 和 socket.io 应用程序
【发布时间】:2016-07-11 15:18:24
【问题描述】:

我的应用程序有一个快速服务器在一个端口 (process.env.PORT) 上侦听,我还想要一个使用另一个端口的 Web 套接字。我曾经在此设置中使用 Express 3:

var express         = require('express'),
    http             = require('http'),
    io              = require('socket.io'),
    app             = express();
    server          = http.Server(app);
    ioServer        = io(server);

ioServer.on('connection', callback);
server.listen(process.env.PORT || 3000, function () {
    console.log('App listening on ' + server.address().port);
});

上面的代码运行良好,因为在创建 ioServer 时,不需要特定的端口。然而,在我切换到 Express 4 并开始使用 Heroku 的 WebSocket 服务后,我不得不像这样指定一个端口:

var WebSocketServer = require('ws').Server,
    port = 5000,
    server = http.createServer(app);
    server.listen(port);

var wss = new WebSocketServer({server: server});

wss.on('connection', callback);

app.listen(app.get('port'), function() {
    console.log('Express server listening.'));
});

这个新设置永远不会起作用,因为当我在 Heroku 上运行应用程序时,我收到一个错误,抱怨同一个端口不能被使用两次:

Error: listen EADDRINUSE :::40854

除了在 Express 4 中显式分配端口外,设置逻辑基本相同,那么为什么我的代码适用于 Express 3 而不是 Express 4?我应该如何解决这个问题?

【问题讨论】:

    标签: node.js sockets express heroku websocket


    【解决方案1】:

    在您的第二个代码块中,您不能在您的服务器和您的应用程序对象上调用.listen()。在这种特殊情况下(您构建代码的方式),您只想在 server 对象上调用它,而不是在 app 上。

    这是Heroku's dev page关于这个话题的代码:

    var WebSocketServer = require("ws").Server
    var http = require("http")
    var express = require("express")
    var app = express()
    var port = process.env.PORT || 5000
    
    app.use(express.static(__dirname + "/"))
    
    var server = http.createServer(app)
    server.listen(port)
    
    console.log("http server listening on %d", port)
    
    var wss = new WebSocketServer({server: server})
    console.log("websocket server created")
    

    另外,您的第一个代码块没有在两个端口上运行。与 webSockets 的通常设计一样,单个端口用于 Web 请求和 webSocket 连接。 Web 服务器本身根据初始连接将两种类型的连接分开。

    【讨论】:

    • > "与 webSockets 的设计一样,Web 请求和 webSocket 连接都使用一个端口。Web 服务器本身根据初始连接将两种类型的连接分开。 "正是我需要的:)
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    相关资源
    最近更新 更多