如何在同一个端口上运行 express 和 socket.io
Posted
技术标签:
【中文标题】如何在同一个端口上运行 express 和 socket.io【英文标题】:How do you run express and socket.io on the same port 【发布时间】: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/');
【问题讨论】:
【参考方案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 - 这意味着您在该服务器上已经有一些东西正在监听该端口。 为什么投反对票?没有给出任何解释的反对者不会帮助人们改善他们的答案。以上是关于如何在同一个端口上运行 express 和 socket.io的主要内容,如果未能解决你的问题,请参考以下文章
通过 Visual Studio 在同一端口上运行多个 IIS Express 实例
NodeJS Express - 同一端口上的两个 NodeJS 实例(vhost)
Node.js - 在同一个端口上使用 Socket.io 和 Express
在同一端口上运行多个 Node (Express) 应用程序