Socket.io客户端不能连接服务器

我几个星期前开始阅读关于node.js的内容,并决定了解更多。 我在我的Linux服务器(Turnkey Linux,基本上是Ubuntu)上安装了node和socket.io以及其他一些软件包(expression了一些,我不记得)。 我find了一些教程,并通过它们,并没有得到任何客户发送消息回服务器。 下面是我经历的一些教程(我有更多,但该网站不会让我发布更多的链接):

简单聊天室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/

请注意,networking服务器在networking上有一个现场演示,它可以在我的浏览器中从两台不同的计算机上运行。 有一个链接到我下载和运行的代码,服务器运行得很好。 我去了url(192.168.0.30:3000在我的局域网),它显示正确的HTML和控制台输出“debugging – 服务静态/socket.io.js”一旦我浏览到URL。 当我input信息时,“input”什么也没有发生。 我把警报放入代码中,似乎在“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机器浏览,这就是为什么我不从本地主机testing,虽然我假设这应该从其他主机作为certificate了HTML服务和消息输出时,我冲浪到页面。 任何想法,为什么我从来没有从客户端的任何消息到服务器? 我假设我每个教程都犯了同样的错误,因为大约有8个人尝试过,但我总是遇到同样的问题。 谢谢。

达里尔

这是对阿尔弗雷德答复之后的意见的回应。 我无法弄清楚如何在该行中添加另一条评论,所以我发布了一个“答案”。

@阿尔弗雷德 – 感谢这个例子,但是这看起来好像很多东西,但丹尼尔说,考虑到我没有得到一个简单的信息去通过。 @Daniel – 就文档而言,我仍然不明白如何在socket.io主页上实际使用示例。 有一个“如何使用”的链接,什么也不做,一个维基链接,没有解释任何有关的例子。 我知道如何启动服务器,但仍然不知道如何将客户端连接到服务器,甚至不知道如何“启动”客户端。 大多数教程都有一些“链接代码”,指向服务器的客户端页面,然后将浏览器指向“http:// yoursiteaddress:port”,然后显示页面。 在socket.io主页上的代码在客户端和服务器端代码之间没有这样的“连接”。 你应该冲浪到“客户”的代码? 我尝试过,它提供了完全相同的代码,无论我去哪个URL假设我要去“http:// yoursiteaddress:port”这是有道理的,但我没有看到任何文档实际解释如何使用码。 因此,我去教程,显然都使用旧的代码。 有一些我错过的文档吗?

我敢打赌,问题在于你的依赖。 举个例子来看看我的依赖:

 $ 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. 我build议你阅读迁移说明 。

我喜欢为你提供真正简单的演示(利用你已经安装的快车),希望能够工作。

 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这是目前最新的0.6.x内的文件夹node_modules内的目录。 由于node.js模块系统 ,Node.js将在本地包含该模块。 您可以通过创build该目录(如果该目录尚不存在)执行此操作,请发出mkdir -p node_modules 。 接下来安装socket.io,发出npm install socket.io@0.6.18 。 那么我认为你应该能够运行这些老例子。