【问题标题】:How do you run express and socket.io on the same port如何在同一个端口上运行 express 和 socket.io
【发布时间】:2015-01-07 10:15:39
【问题描述】:

它总是很烦人,我必须始终在我的 app.js 中运行监听一个新端口,这意味着例如我可以使用 localhost:3000 和 localhost:4000 访问我的网站,而我网站上的 socket.io 只能使用 localhost:4000 工作。我只是把它推到heroku,然后意识到我什至不能改变heroku上的端口

这就是我所拥有的

app.js:

var express = require("express");
var io = require('socket.io')
var port = 3000;

var app = express()
  , server = require('http').createServer(app)
  , io = io.listen(server);

server.listen(3000);

module.exports = io;

client.js:

var socket = io('http://localhost/');

【问题讨论】:

    标签: node.js heroku express socket.io


    【解决方案1】:

    我可以为所欲为:

    var exp = express();
    var server = require('http').Server(exp)
    var io = require('socket.io')(server);
    
    //setup stuff
    
    server.listen(3000)
    

    【讨论】:

    • 哈哈!我们又见面了:D 不过这让我听EADDRINUSE
    • EADDRINUSE 表示其他东西正在该端口上侦听。可能在节点应用程序中,也可能是其他进程。确保你在你的 bash shell 中 killall node 杀死所有其他节点进程。还要确保没有其他代码在执行listen。我在您的代码中看到了 ` , io = io.listen(server);`。您是否删除了它和所有其他“监听”?
    • 是的,除了我执行 npm start 时,没有其他进程正在运行。为什么我已经可以连接到localhost:3000 而无需在我的快速应用程序中指定服务器内容。我不必做server.listen(3000)
    • 我说应该只有一个listen,即server.listen(3000),请从您的代码中删除行 ` , io = io.listen(server);`
    • 如果你使用 express 生成器,它在 bin/www 中有 server.listen(port)。这导致了我的 EADDRINUSE。
    【解决方案2】:

    express 4 + socket.io 1.0(我自己用的)最简单的版本是这样的:

    var express = require('express');
    var app = express();
    var server = app.listen(3000, function() {
        console.log("server started on port 3000");
    });
    
    var io = require('socket.io').listen(server);
    

    老实说,我不知道为什么您的版本不起作用,但已经建议几个人遵循这个顺序(我从文档中得到),它对我自己和他们都有效。这可能与 io 正确插入 express 4 并且不使用一般的 http 模块,而是使用 express 代替有关。

    【讨论】:

    • 对我没用,我收到端口正在使用中的警告。
    • @SvenB - 这意味着您在该服务器上已经有一些东西正在监听该端口。
    • 为什么投反对票?没有给出任何解释的反对者不会帮助人们改善他们的答案。
    猜你喜欢
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    相关资源
    最近更新 更多