nodejs EADDRINUSE错误

时间:2015-02-25 20:03:55

标签: javascript node.js port

我开始使用[cloud9] [1]并尝试托管我的nodejs应用。 当我尝试运行我的应用程序时,它会让我跟踪错误:

重要提示:使用process.env.PORT作为端口,并使用process.env.IP作为

中的主机
Important: use process.env.PORT as the port and process.env.IP as the host in your scripts!                                                                            

debugger listening on port 15454                                                                                                                                       
8080                                                                                                                                                                   
0.0.0.0                                                                                                                                                                

events.js:72                                                                                                                                                           
        throw er; // Unhandled 'error' event                                                                                                                           
              ^                                                                                                                         
Error: listen EADDRINUSE                                                                                                                
    at errnoException (net.js:905:11)                                                                                                   
    at Server._listen2 (net.js:1043:14)                                                                                                 
    at listen (net.js:1065:10)                                                                                                          
    at Server.listen (net.js:1147:9)                                                                                                    
    at exports.lookup.callback (dns.js:72:18)                                                                                                                          
    at process._tickCallback (node.js:442:13)                                                                                                                          
    at Module.runMain [as _onTimeout] (module.js:499:11)                                                                                                               
    at Timer.listOnTimeout [as ontimeout] (timers.js:112:15)

我的app.js:

var app = require('express')();
//var app = express();
//var http = require('http');
var server = require('http').Server(app);
var io = require('socket.io')(server);
app.set('port', process.env.PORT || 3000);
var port = app.get('port');
console.log(port);
server.listen(port, process.env.IP);
// routing
app.get('/', function (req, res) {
    res.sendfile(__dirname + '/index.html');
});
// usernames which are currently connected to the chat
var usernames = {};
// rooms which are currently available in chat
var rooms = [];
io.sockets.on('connection', function (socket) {
    socket.on('adduser', function (username, room) {
        socket.username = username;
        socket.room = room;
        usernames[username] = username;
        socket.join(room);
        socket.emit('updatechat', 'SERVER', 'You are connected. Start chatting');
        socket.broadcast.to(room).emit('updatechat', 'SERVER', username + ' has connected to this room');
    });
    socket.on('createroom', function () {
        var new_room = (""+Math.random()).substring(2,7);
        rooms.push(new_room);
        socket.emit('updatechat', 'SERVER', 'Your room is ready, invite someone using this ID:' + new_room);
        socket.emit('roomcreated', new_room);
    });
    // when the client emits 'sendchat', this listens and executes
    socket.on('sendchat', function (data) {
        // we tell the client to execute 'updatechat' with 2 parameters
        io.sockets. in (socket.room).emit('updatechat', socket.username, data);
    });

    // when the user disconnects.. perform this
    socket.on('disconnect', function () {
        // remove the username from global usernames list
        delete usernames[socket.username];
        // update list of users in chat, client-side
        io.sockets.emit('updateusers', usernames);
        // echo globally that this client has left
        if(socket.username !== undefined){
            socket.broadcast.emit('updatechat', 'SERVER', socket.username + ' has disconnected');
            socket.leave(socket.room);
        }
    });
});

我尝试查找已经在8080运行的任何进程,这是输出

user@chat_room:~/workspace (master) $ ps ax | grep node
14154 pts/1    S+     0:00 grep --color=auto node

如果我尝试使用其他端口,那么我没有收到套接字文件,它会引发404错误:

<script src="/socket.io/socket.io.js"></script>

这在本地工作正常。

修改 打开端口:

user@chat_room:~/workspace (master) $ netstat --listen
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 *:mysql                 *:*                     LISTEN     
tcp        0      0 localhost:17123         *:*                     LISTEN     
tcp6       0      0 [::]:http-alt           [::]:*                  LISTEN     
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN     
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  2      [ ACC ]     STREAM     LISTENING     353035357 /tmp/tmux-1000/cloud91.8
unix  2      [ ACC ]     STREAM     LISTENING     351539622 /home/ubuntu/lib/mysql/socket/mysql.sock
unix  2      [ ACC ]     STREAM     LISTENING     352204732 /home/ubuntu/.c9/1312164/collab.sock


user@chat_room:~/workspace (master) $ netstat -vatn
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:17123         0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:37186         127.0.0.1:15455         TIME_WAIT  
tcp        0      0 127.0.0.1:15454         127.0.0.1:59371         TIME_WAIT  
tcp6       0      0 :::8080                 :::*                    LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0    400 172.17.0.248:22         10.240.179.70:43154     ESTABLISHED


user@chat_room:~/workspace (master) $ netstat -vat
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 *:mysql                 *:*                     LISTEN     
tcp        0      0 localhost:17123         *:*                     LISTEN     
tcp        0      0 localhost:37186         localhost:15455         TIME_WAIT  
tcp        0      0 localhost:15454         localhost:59371         TIME_WAIT  
tcp6       0      0 [::]:http-alt           [::]:*                  LISTEN     
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN     
tcp6       0      0 user-chat_:ssh 10.240.179.70:43154     ESTABLISHED


user@chat_room:~/workspace (master) $ lsof -i
COMMAND     PID   USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
mysqld     2316 ubuntu   10u  IPv4 351539621      0t0  TCP *:mysql (LISTEN)
apache2    2374 ubuntu    4u  IPv6 351539675      0t0  TCP *:http-alt (LISTEN)
apache2    2381 ubuntu    4u  IPv6 351539675      0t0  TCP *:http-alt (LISTEN)
apache2    2382 ubuntu    4u  IPv6 351539675      0t0  TCP *:http-alt (LISTEN)
apache2    2383 ubuntu    4u  IPv6 351539675      0t0  TCP *:http-alt (LISTEN)
apache2    2384 ubuntu    4u  IPv6 351539675      0t0  TCP *:http-alt (LISTEN)
apache2    2385 ubuntu    4u  IPv6 351539675      0t0  TCP *:http-alt (LISTEN)
vfs-worke 13915 ubuntu   13u  IPv4 352221394      0t0  TCP localhost:17123 (LISTEN)

3 个答案:

答案 0 :(得分:3)

我会说错误说了一切:

  

重要提示:使用process.env.PORT作为端口,并使用process.env.IP作为脚本中的主机!

你的环境要求你分别使用process.env.PORTprocess.env.IP来获取端口和ip(是cloud9吗?),但是在这一行你还在使用另一个环境变量:

app.set('port', process.env.app_port || 8080)

修正:

app.set('port', process.env.PORT || 8080)

(通常,EADDRINUSE错误是针对另一个进程正在侦听该端口的时候)

对于404错误

EDIT :之前发布的代码是旧版本的Express。见http://socket.io/docs/#using-with-express-3/4

答案 1 :(得分:3)

您的代码是否可以在源代码的两个位置请求listen()到同一个端口?我没有看到两个听电话,但我不熟悉快递或套接字以了解其他功能是否这样做......虽然在不同的情况下它发生在我身上。

答案 2 :(得分:0)

使用以下命令列出端口8080上运行的进程: lsof -i:8080, 使用正在运行的进程的PID通过使用命令终止使用端口8080的实例: kill -9 PID