聊天应用程序不会使用socket.io和node.js./express在端口80上运行

时间:2015-05-04 02:19:28

标签: javascript node.js sockets socket.io

我试图在我的网站上实现最基本的socket.io/node.js应用程序。我想在app.js中的端口80(http)而不是端口3000上运行它,无论出于何种原因,它都会破坏整个应用服务器端。我只是将server.listen(3000)更改为server.listen(80),它打破了应用程序。这是app.js和客户端脚本。我对堆栈格式化不是很好,请原谅我。

服务器端App.Js:

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


server.listen(3000);

app.get('/', function(req, res){
res.sendFile(__dirname + '/chat.html');

});


io.sockets.on('connection', function(socket){
socket.on('new user', function(data, callback){
    if(nicknames.indexOf(data) != -1){
        callback(false);
    }
    else{
        callback(true);
        socket.nickname = data;
        nicknames.push(socket.nickname);
        io.sockets.emit('usernames', nicknames);
    }

});
socket.on('send message', function(data){
    io.sockets.emit('pushMessage', {msg: data, nick: socket.nickname});


});

socket.on('disconnect', function(data){
    if(!socket.nickname) return;
    nicknames.splice(nicknames.indexOf(socket.nickname), 1);
    io.sockets.emit('usernames',nicknames);

});
});

客户端HTML / JS:

    <html>
    <head>
    <script   src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
     <title>SchoolChat</title>
     <style>
    #chat{
    height:500px;
    }
    #mainWrap{
    display:none;
    } 
    #chatWrap{
    float: left;
    border:1px #000 solid;

    }

#chat {
    list-style-type: none;
    margin:0;
    padding:0;

}
#chat li {
    padding:5px 10px;

}

#chat li: nth-child(odd) {
    background:#eee;
}
</style>
</head>
<body>
<div id="nickWrap">
<p>Enter a Username</p>
<p id="nickError"></p>
<form id="setUser">
<input size="35" id="userName"></input>
<input type="submit"></input>
</form>
</div>

    <div id="mainWrap">
    <div id="chatWrap">
        <ul id="chat"></ul>
        <form id="send-message">
        <input size="35" id="message"></input>
        <input type="submit"></input>
        </form>
    </div>
    <div id="users"></div>
    </div>



    <script src="/socket.io/socket.io.js"></script>
    <script>
    jQuery(function($){
        var socket = io.connect();
        var $messageForm = $('#send-message');
        var $usernameForm = $("#setUser");
        var $userName = $("#userName");
        var $nickError = $("nickError");
        var $nickBox= $('#nickWrap');
        var $messageBox = $('#message');
        var $chat = $('#chat');

            $usernameForm.submit(function(e){
                e.preventDefault();
                socket.emit('new user', $userName.val(), function(data){
                if (data){
                    $("#nickWrap").hide();
                    $("#mainWrap").show();
                }
                else{
                    $("#nickError").html('That username is already in use.');

                }



                });
                $nickBox.val('')
            });

            socket.on('usernames', function(data){
                var html= " ";
                for(i=0; i<data.length; i++){
                    html += data[i] + '</br>'

                }
                $('#users').html(html);

            });

        $messageForm.submit(function(e){
            e.preventDefault();
            socket.emit('send message', $messageBox.val());
            $messageBox.val("");

        });



        socket.on('pushMessage', function(data){
            $chat.append("<li><b>" + data.nick+ ":" + "</b>" + data.msg+ "</li>");


            });

    });
        </script>
</html>

2 个答案:

答案 0 :(得分:1)

有很多事情可能会出错。需要一些诊断。首先,是否有任何错误消息产生?

另一项服务正在侦听端口80

以下是来自Node.js站点(在Windows命令行下)的略微修改的Hello World应用程序:

> var http = require('http');
undefined
> http.createServer(function (req, res) {
...   res.writeHead(200, {'Content-Type': 'text/plain'});
...   res.end('Hello World\n');
... }).listen(80, '127.0.0.1');
{ domain: null,
  _events:
   { request: [Function],
     connection: [Function: connectionListener],
     clientError: [Function] },
  _maxListeners: 10,
  _connections: 0,
  connections: [Getter/Setter],
  _handle: null,
  _usingSlaves: false,
  _slaves: [],
  allowHalfOpen: true,
  httpAllowHalfOpen: false,
  timeout: 120000 }

但是如果我们在已经使用的端口135上尝试相同的事情:

> http.createServer(function (req, res) {
...   res.writeHead(200, {'Content-Type': 'text/plain'});
...   res.end('Hello World\n');
... }).listen(135, '127.0.0.1');
{ domain: null,
  _events:
   { request: [Function],
     connection: [Function: connectionListener],
     clientError: [Function] },
  _maxListeners: 10,
  _connections: 0,
  connections: [Getter/Setter],
  _handle: null,
  _usingSlaves: false,
  _slaves: [],
  allowHalfOpen: true,
  httpAllowHalfOpen: false,
  timeout: 120000 }
>
events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: listen EACCES
    at errnoException (net.js:904:11)
    at Server._listen2 (net.js:1023:19)
    at listen (net.js:1064:10)
    at net.js:1146:9
    at dns.js:72:18
    at process._tickCallback (node.js:419:13)

在Windows和类UNIX操作系统上查看正在使用的端口的命令是netstat -a

您的操作系统/防火墙阻止侦听端口80

类UNIX操作系统将0到1023范围内的端口保留为众所周知的或系统端口。要解决这个问题,请查看答案'Linux: allowing an user to listen to a port below 1024'

Windows防火墙通常会干扰首次打开的进程。这通常会弹出一条消息,解释它正在做什么,除非它被明确阻止。但是从第一个示例中可以看出,它将允许常规进程打开端口80。

答案 1 :(得分:0)

也许为时已晚,但是对于那些将来会面临这个问题的人来说,这种情况发生在我身上,问题来自skype,你需要去skype设置并在连接下取消选中使用端口80。