node.js socket.io简单的聊天

我开始玩node.js,并且和大家一样,我想聊聊天。

我的想法是在9090端口上运行node.js和socket.io,而我的客户端html在端口8080上运行。我的html客户端将独立运行。

我的服务器:

var sys = require('sys'); var express = require('express'); var io = require('socket.io'); var app = express.createServer(); app.listen(8080); var socket = io.listen(app); socket.on('connection', function (client) { client.on('message', function (msg) { socket.broadcast(msg); }); client.on('disconnect', function () { }); }); 

我的客户:

 <!DOCTYPE html> <html> <head> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script> <script src="http://cdn.socket.io/stable/socket.io.js"></script> <script> $(document).ready(function () { var socket = new io.Socket("localhost", {port: 8080}); socket.on('connect', function () { socket.send('A client connected.'); }); socket.on('message', function (message) { $('div#messages').append($('<p>'), message); }); socket.on('disconnect', function () { console.log('disconnected'); }); socket.connect(); $('input').keydown(function (event) { if(event.keyCode === 13) { socket.send($('input').val()); $('input').val(''); } }); }); </script> </head> <body> <input type="text" style="width: 300px;" /> <div id="messages" style="border:solid 1px #000;">&nbsp;</div> </body> </html> 

我正在使用node.js v0.4.10在Ubuntu 11.04中运行。

服务器工作正常,但客户端无法连接,在谷歌浏览器console.log我收到此消息:XMLHttpRequest无法加载http:// localhost:8080 / socket.io / xhr-polling // 1311465961485 。 Access-Control-Allow-Origin不允许来源http:// localhost 。

server.js位于/ var / www / cliente / chat / public中的文件夹中。

有什么问题?

您的客户端代码实际上并不是根据您的需要从端口8080提供的。

 var sys = require('sys'); var express = require('express'); var io = require('socket.io'); var app = express.createServer(); app.listen(8080); app.use(express.static(__dirname)); app.get('/', function(req, res){ res.render('index.html', { title: 'Chat' }); }); var socket = io.listen(app); socket.on('connection', function (client) { client.on('message', function (msg) { socket.broadcast(msg); }); client.on('disconnect', function () { }); }); 

这应该修复您的Access-Control-Allow-Origin错误。 执行node server.js并连接到http:// localhost:8080 。 一些额外的笔记:

  1. 确保你已经安装了socket.io 0.6.x,因为这就是你在html文件中包含的内容。 0.7.x是向后不兼容的。

  2. 使用这个configuration,你将在你服务你的页面的同一个端口上运行socket.io(而不是9090)。

当我更新我的客户到:

 <!DOCTYPE html> <html> <head> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script> <script src="http://localhost:8080/socket.io/socket.io.js"></script> <script> var socket = io.connect("http://localhost", {port: 8080}); socket.on('connect', function () { socket.send('A client connected.'); }); socket.on('message', function (msg) { $('div#messages').append($('<p>'), msg); }); socket.on('disconnect', function () { console.log('disconnected'); }); $(document).ready(function(){ $('#btn_send').click(function (event) { socket.send($('#txt_msg').val()); $('#txt_msg').val(''); }); }); </script> </head> <body> <input type="text" id="txt_msg" style="width: 300px;" /><input type="button" id="btn_send" value="send" /> <div id="messages" style="border:solid 1px #000;">&nbsp;</div> </body> </html> 

一切正常。

我正在使用一个版本0.7的socket.io是这个问题: https : //github.com/LearnBoost/Socket.IO/wiki/Migrating-0.6-to-0.7

您不能对与当前页面不在同一主机名和端口上的URL发出AJAX请求。 这是所有网页浏览器的安全限制。