与本地客户端的Socket.io。 Origin null和Access-Control-Allow-Origin

我试图用本地客户端testing一个简单的socket.io示例。 这是我的代码:

服务器:

var sio = require('socket.io'); var io = sio.listen(8077, {log: false}); io.sockets.on('connection', function (socket) { console.log('connection detected'); socket.on('hello', function(data){ console.log('hello received: ' + data); }); }); 

客户:

 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <script src="socket.io-client/dist/socket.io.js" type="text/javascript"></script> </head> <body> <script type="text/javascript"> var socket = io.connect('http://localhost:8077'); if(socket != undefined){ socket.emit('hello', 'this is a test'); } </script> </body> </html> 

如果我把我的客户端放在远程服务器上,它运行的很好,但是如果我尝试从本地运行我的客户端,我的浏览器会给我下面的错误:

 XMLHttpRequest cannot load http://localhost:8077/socket.io/1/?t=1343494806858. Origin null is not allowed by Access-Control-Allow-Origin 

我知道有一个HTTP头解决了这个问题在http服务器,但我不知道在套接字上下文中是否有类似的选项。 我需要一个本地客户端。 我不想从一个额外的http nodejs服务器提供客户端代码。

你有没有尝试设置服务器的起源参数(它设置你提到的头)?

 var sio = require('socket.io'); var io = sio.listen(8077, {log: false, origins: '*:*'}); 

另外现在你不是在本地访问该服务器,你有没有确保更新该行:

 var socket = io.connect('http://localhost:8077'); 

要包含远程服务器的ip(或域,如果有的话):

 var socket = io.connect('http://XX.XX.XX.XX:8077'); 

你能看到什么行返回控制台中的错误(你使用chrome / ff与萤火虫?)。 在if语句中,套接字variables可能永远不会被定义。 build议使用连接的方法是通过给connect事件附加一个callback来等待它的准备就绪,例如:

 socket.on('connect', function () { // <-instead of the if socket.emit('hello', 'this is a test'); }