【问题标题】:Chat application won't run on port 80 with socket.io and node.js./express使用 socket.io 和 node.js./express 的聊天应用程序不会在端口 80 上运行
【发布时间】:2015-07-13 08:09:56
【问题描述】:

我正在尝试在我的网站上实现最基本的 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>

【问题讨论】:

  • 你在什么操作系统上运行服务器?您是否以足够高的权限运行以侦听端口 80?
  • Dylan,由于您是 Stackoverflow 的新人,我会指出,当您在此处发布问题时,您应该在前 30 分钟内多次查看是否有澄清问题,所以人们可以理解你的问题。 StackOverflow 不像许多在线论坛那样工作,您在这些论坛中发布您的问题并在很长一段时间后(比如第二天)回来。在这里,如果您的问题不清楚并且您没有回应,您的问题可能会因为不清楚而被关闭。
  • “它破坏了整个应用服务器端”不是很有帮助。出了什么问题?它不听吗?它会崩溃吗?有错误信息吗?

标签: javascript node.js sockets socket.io


【解决方案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。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-17
      • 2014-10-05
      • 2018-04-27
      • 2012-08-11
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 2015-06-17
      相关资源
      最近更新 更多