几个星期前我开始阅读有关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在网络上有一个现场演示,可以在我的浏览器中使用2台不同的计算机。我下载并运行了代码链接,服务器运行正常。我转到网址(我的局域网上为192.168.0.30:3000),当我浏览到URL时,它显示正确的HTML和控制台输出“debug - served static /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个其他教程,但我总是遇到同样的问题。感谢。
的Darryl
答案 0 :(得分:1)
这是对阿尔弗雷德回答后的评论的回应。我无法弄清楚如何在该行中添加另一条评论,所以我发布了一个“答案”。
@Alfred - 感谢这个例子,但是看起来确实很多,因为丹尼尔认为我没有得到一个简单的信息。 @Daniel - 就文档而言,我仍然不知道如何在socket.io主页上实际使用该示例。有一个“如何使用”链接什么都不做,而且一个Wiki链接没有解释这些例子的任何内容。我知道如何启动服务器,但仍然不知道如何将客户端连接到服务器,甚至不知道如何“启动”客户端。大多数教程都有某种“链接代码”指向服务器的客户端页面,然后您只需将浏览器指向“http:// yoursiteaddress:port”并显示该页面。 socket.io主页上的代码在客户端和服务器代码之间没有这样的“连接”。您是否应该浏览“客户端”代码?我尝试了它,它提供完全相同的代码,无论我去哪个URL假设我要去“http:// yoursiteaddress:port”这是有道理的,但我还没有看到任何文档实际解释如何使用它码。因此,我去的教程显然都使用旧代码。是否有一些我遗漏的文件?
答案 1 :(得分:0)
我打赌你的问题在于你的依赖。让我们看一下我的依赖关系,例如:
$ npm ls
├─┬ express@2.4.3
│ ├─┬ connect@1.6.0
│ │ └── qs@0.3.0
│ ├── mime@1.2.2
│ └── qs@0.3.0
├─┬ socket.io@0.7.7
│ ├── bison@1.1.1 extraneous
│ ├── policyfile@0.0.3
│ ├── redis@0.6.0
│ └─┬ socket.io-client@0.7.4
│ └── uglify-js@1.0.3
从socket.io 0.6.x到0.7.x,API经历了一些重大变化。看起来您正在使用socket.io 0.6.x阅读旧教程,并且已安装0.7.x.我建议你阅读migration instructions。
我想为您提供真正简单的演示(使用已安装的快递),希望它能够正常工作。
var app = require('express').createServer(),
sio = require('socket.io');
app.get('/', function(req, res){
res.send('<script src="/socket.io/socket.io.js"></script>\
<script>\
var socket = io.connect("http://192.168.0.30");\
socket.on("news", function (data) {\
alert(data.hello);\
});\
</script>');
});
app.listen(3000);
var io = sio.listen(app);
io.sockets.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
});
连接到socket.io服务器时应该警告world
。
我还认为您的示例可以使用的是安装socket.io 0.6.18,这是目前位于文件夹node_modules
内的最新0.6.x。由于node.js module system,Node.js将在本地包含该模块。您可以通过创建该目录来执行此操作(如果该目录尚不存在,则发出mkdir -p node_modules
。接下来安装socket.io发布npm install socket.io@0.6.18
。然后我认为你应该能够运行这些旧例子。