我试图在我的网站上实现最基本的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>
答案 0 :(得分:1)
有很多事情可能会出错。需要一些诊断。首先,是否有任何错误消息产生?
以下是来自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
。
类UNIX操作系统将0到1023范围内的端口保留为众所周知的或系统端口。要解决这个问题,请查看答案'Linux: allowing an user to listen to a port below 1024'。
Windows防火墙通常会干扰首次打开的进程。这通常会弹出一条消息,解释它正在做什么,除非它被明确阻止。但是从第一个示例中可以看出,它将允许常规进程打开端口80。
答案 1 :(得分:0)
也许为时已晚,但是对于那些将来会面临这个问题的人来说,这种情况发生在我身上,问题来自skype,你需要去skype设置并在连接下取消选中使用端口80。