Node.js和Socket.IO:警告-错误产生:Error: listen EADDRINUSE

12

我正在尝试使用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>

当我尝试使用Node运行app.js时,像这样:

 node app.js 

我遇到了一个错误

 warn  - error raised: Error: listen EADDRINUSE

我查看了一些文档并发现端口正在使用中,因此重新启动了系统,但仍然遇到相同的错误。

请告诉我我可能做错了什么。


尝试使用另一个端口 - 可能8080被其他应用程序占用了。 - pimvdb
我真的有这个问题,找不到任何解决办法。 - Tarek
看起来我没有在server.js文件中编辑端口,所以我通过了错误,但现在我无法正确连接它。 - Tarek
5个回答

6

尝试使用其他端口。例如,8080通常被Tomcat使用。

使用netstat -a -v命令查看当前正在使用的端口。


你能打印出 netstat -a -v 或者 nmap localhost 的输出吗? - Charles
nmap localhost 22/tcp 开放 ssh 25/tcp 开放 smtp 53/tcp 开放 domain 110/tcp 开放 pop3 139/tcp 开放 netbios-ssn 143/tcp 开放 imap 445/tcp 开放 microsoft-ds 631/tcp 开放 ipp 993/tcp 开放 imaps 995/tcp 开放 pop3s 3306/tcp 开放 mysql 8080/tcp 开放 http-proxy - masterofdestiny
我也遇到了同样的问题,但无法确定是否有任何应用程序正在使用此端口。请帮忙... - Nikita Sharma Sahu

1

我看你在客户端没有连接到主机:

var iosocket = io.connect('http://localhost:8080');

你说得对,但如果我没记错的话,这个问题是来自服务器端。 - masterofdestiny
使用readFile代替res.end(fs.readFileSync(__dirname + '/index.html')); - ashley

1

您未连接到服务器,这是错误的:

var iosocket = io.connect();

这是正确的:
var iosocket = io.connect('http://localhost:8080');

此外,您的服务器上的端口8080被“http-proxy”使用,请尝试使用其他端口。


1
一个非常愚蠢/简单的可能性是确保您没有打开多个终端窗口。我遇到了这个错误,并意识到我有第二个预先存在的连接,我用它启动了我的应用程序。当我关闭它并重新启动应用程序时,错误消失了。

我同时打开了Putty和WinSCP,但一直收到EADDRINUSE错误;当我关闭两者并重新启动Putty后,我成功地启动了node - txs。 - Data

0

以下是一个面向初学者的示例,演示如何设置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);
});

我认为这是一个有用的例子,希望它能帮助那些在设置过程中遇到问题的人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接