Nodejs & socket io:警告 - 引发错误:错误:监听 EADDRINUSE
Posted
技术标签:
【中文标题】Nodejs & socket io:警告 - 引发错误:错误:监听 EADDRINUSE【英文标题】:Nodejs & socket io : warn - error raised: Error: listen EADDRINUSE 【发布时间】:2013-01-16 19:45:46 【问题描述】:我正在尝试使用 socket.io 的 Node.js
现在这是我的场景,我是 ubuntu 12.04 用户,我在桌面上有文件夹 pp
我在里面放了服务器文件,即app.js
这里是内容
var fs = require('fs')
, http = require('http')
, socketio = require('socket.io');
var server = http.createServer(function(req, res)
res.writeHead(200, 'Content-type': 'text/html');
res.end(fs.readFileSync(__dirname + '/index.html'));
).listen(8080, function()
console.log('Listening at: http://localhost:8080');
);
socketio.listen(server).on('connection', function (socket)
socket.on('message', function (msg)
console.log('Message Received: ', msg);
socket.broadcast.emit('message', msg);
);
);
现在在同一个文件夹中我有另一个文件 index.html 像
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script>
$(function()
var iosocket = io.connect();
iosocket.on('connect', function ()
$('#incomingChatMessages').append($('<li>Connected</li>'));
iosocket.on('message', function(message)
$('#incomingChatMessages').append($('<li></li>').text(message));
);
iosocket.on('disconnect', function()
$('#incomingChatMessages').append('<li>Disconnected</li>');
);
);
$('#outgoingChatMessage').keypress(function(event)
if(event.which == 13)
event.preventDefault();
iosocket.send($('#outgoingChatMessage').val());
$('#incomingChatMessages').append($('<li></li>').text($('#outgoingChatMessage').val()));
$('#outgoingChatMessage').val('');
);
);
</script>
</head>
<body>
Incoming Chat: <ul id="incomingChatMessages"></ul>
<input type="text" id="outgoingChatMessage">
</body>
当我尝试使用节点运行 app.js 时
node app.js
我收到了错误
warn - error raised: Error: listen EADDRINUSE
我浏览了一些文档,发现端口很忙,所以重新启动了系统,但我仍然遇到同样的错误。
请告诉我我做错了什么。
【问题讨论】:
尝试另一个端口 - 可能8080
已被其他应用程序使用。
我真的有这个问题,我找不到任何解决方案。
看来是我没有编辑server.js文件中的端口,所以报错了,但是现在无法正确连接。
【参考方案1】:
尝试另一个端口。 8080通常被tomcat使用,例如
使用netstat -a -v
了解当前使用的端口。
【讨论】:
能否打印netstat -a -v
或nmap localhost
的输出。
nmap localhost 22/tcp open ssh 25/tcp open smtp 53/tcp open domain 110/tcp open pop3 139/tcp open netbios-ssn 143/tcp open imap 445/tcp open microsoft-ds 631 /tcp 打开 ipp 993/tcp 打开 imaps 995/tcp 打开 pop3s 3306/tcp 打开 mysql 8080/tcp 打开 http-proxy
我也遇到了同样的问题,但看不到是否有任何应用程序使用此端口。请帮忙...【参考方案2】:
在我看来,您没有连接到客户端的主机:
var iosocket = io.connect('http://localhost:8080');
【讨论】:
你是对的,但如果我没记错的话,这个问题来自服务器端 而不是res.end(fs.readFileSync(__dirname + '/index.html'));
使用readFile
【参考方案3】:
你没有连接到你的服务器,这是错误的:
var iosocket = io.connect();
这是对的:
var iosocket = io.connect('http://localhost:8080');
另外,“http-proxy”在您的服务器上使用了您的端口 8080,请尝试其他端口。
【讨论】:
【参考方案4】:一个超级愚蠢/简单的可能性是确保您没有打开多个终端窗口。我收到此错误并意识到我有第二个预先存在的连接,我已经启动了我的应用程序。当我关闭它并重新启动应用程序时,错误消失了。
【讨论】:
我打开了 Putty 和 WinSCP 并不断收到 EADDRINUSE 错误;当我关闭两者并仅重新启动 Putty 时,我能够启动节点 - txs。【参考方案5】:下面是一个示例,供初学者如何设置 NodeJS + Express + SocketIO,以便在第二次启动应用时不会出现 EADDRINUSE 错误:
'use strict';
// Init
var http = require('http');
var express = require('express');
var socketIO = require('socket.io');
var cors = require('cors');
// Create Server app
var app = express();
var server = http.createServer(app);
var io = socketIO(server);
// Socket.io settings
io.set('browser client minification', true);
io.set('browser client etag', true);
io.set('browser client gzip', true);
io.set('browser client expires', true);
// Starting Express server
server.listen(serverPort, function()
console.log(chalk.green('Server is running on localhost:' + serverPort + '...'));
);
// Middleware
app.use(cors());
// Routes
app.get('/', function(req, res)
res.send("Hello world!");
console.log("Root visited!");
// Broadcast socketIO message inside Express
io.emit('new_message', "Hello world!");
);
// Socket.io
var connections = [];
var title = "Untitled";
io.sockets.on('connection', (socket) =>
socket.once('disconnect', () =>
connections.splice(connections.indexOf(socket), 1);
socket.disconnect();
console.log('Disconnected: %s. Remained: %s.', socket.id, connections.length)
);
// ...
connections.push(socket);
console.log('Connected: %s. Total: %s', socket.id, connections.length);
);
我认为这是一个有用的例子,我希望它能帮助遇到问题的人设置这一切。
【讨论】:
以上是关于Nodejs & socket io:警告 - 引发错误:错误:监听 EADDRINUSE的主要内容,如果未能解决你的问题,请参考以下文章
Socket.io & Redis - 适合 io 游戏的架构?
继续获取和发布 /socket.io/?EIO=3&transport=polling&t=
GET http://localhost:8080/socket.io/?EIO=3&transport=polling&t=McNiz_D 404(未找到)