【发布时间】:2011-08-03 21:04:16
【问题描述】:
几周前我开始阅读有关 node.js 的信息,并决定进一步了解它。我在我的 Linux 服务器(Turnkey Linux,基本上是 Ubuntu)上安装了 node 和 socket.io 以及其他一些软件包(express 和一些我不记得了)。我找到了一些教程并浏览了它们,但无法让任何客户端将消息发送回服务器。以下是我学习过的一些教程(我还有更多,但网站不允许我发布更多链接):
简单的聊天室 http://vivahate.com/2011/03/25/a-simple-chat-room-in-node-js/
简单的 Socket.io 实时聊天 http://webdevrefinery.com/forums/topic/7991-simple-socketio-real-time-chat/
请注意,webdevrefinery 有一个在线演示,它可以在我的浏览器中从两台不同的计算机上运行。有一个我下载并运行的代码链接,服务器运行得很好。我转到 url(我的 LAN 上的 192.168.0.30:3000),它显示正确的 HTML,并且只要我浏览到该 URL,控制台就会输出“调试 - 提供静态 /socket.io.js”。当我输入信息并“输入”时,什么也没有发生。我将警报放入代码中,它似乎在“sendMsg()”中的“socket.send”行上失败了。这是我正在使用的代码:
server.js:
var http = require('http'),
sys = require('sys'),
fs = require('fs'),
io = require('socket.io');
var server = http.createServer(function(req, res) {
fs.readFile('chat.html', 'binary', function(err, data) {
if( err ) {
res.writeHead(500, {'Content-type': 'text/html'});
res.write(data + "\n");
res.end();
return;
}
res.writeHead(200, {'Content-type': 'text/html'});
res.write(data, 'binary');
res.end();
});
});
server.listen(3000);
var socket = io.listen(server);
socket.on('connection', function( client ) {
client.on('message', function(data) {
console.log("Message: " + JSON.stringify(data));
socket.broadcast(data);
});
client.on('disconnect', function() {
});
});
client.html
<html>
<head>
<style type="text/css">
#msgs {
height: 50%;
overflow-y: scroll;
}
div.odd {
background-color: gray;
}
</style>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
<script type="text/javascript" src="http://192.168.0.30:3000/socket.io/socket.io.js"></script>
<title>Realtime Chat Test</title>
</head>
<body>
<div id="container">
<div id="msgs"></div>
<div id="form">
<form id="chat" action="javascript:sendMsg()">
Username:<input type="text" name="username" /><br />
Message:<input id="msg" type="text" name="message" /><br />
<input type="submit" />
</form>
</div>
</div>
</body>
<script type="text/javascript">
var socket = new io.Socket("192.168.0.30", {port:3000});
socket.connect();
var classes = new Array('even', 'odd');
var numMsgs = 0;
function reconnect() {
if( socket.connecting ) {
setTimeout('reconnect()',1000);
}
else if( !socket.connected ) {
socket.connect();
setTimeout('reconnect()',1000);
}
}
socket.on('disconnect', function() {
reconnect();
});
socket.on('message', function(data) {
var ms = JSON.parse(data);
if( ms.username !== undefined && ms.message !== undefined ) {
numMsgs++;
$('#msgs').append( function() {
var d = $('<div class="'+classes[numMsgs%2]+'"/>');
d.text(ms.username + ' says: ' + ms.message);
return d;
});
var objDiv = document.getElementById('msgs');
objDiv.scrollTop = objDiv.scrollHeight;
}
});
function sendMsg() {
var values = {};
$.each($('#chat').serializeArray(), function(i,v) {
values[v.name] = v.value;
});
document.getElementById("msg").value = "";
socket.send(JSON.stringify(values));
}
</script>
</html>
我使用的 Linux 发行版没有 X 或类似的东西,因为我从 Windows 机器上进行所有浏览,这就是为什么我不从 localhost 进行测试的原因,尽管我假设这应该可以从其他主机,如我浏览页面时提供的 HTML 和输出的消息所证明的那样。关于为什么我从来没有从客户端收到任何消息到服务器的任何想法?我假设我在每个教程中都犯了同样的错误,因为我尝试过大约 8 个其他教程,但我总是遇到同样的问题。谢谢。
达里尔
【问题讨论】: