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

标签 javascript sockets node.js websocket socket.io

我正在尝试使用本地客户端测试一个简单的 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 header 可以解决这个问题,但我不知道套接字上下文中是否有类似的选项。我需要一个本地客户。我不想从额外的 http nodejs 服务器提供客户端代码。

最佳答案

您是否尝试过设置服务器起源参数(它设置您提到的 header )?:

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 和 firebug?)。在 if 语句中,套接字变量可能永远不会未定义。使用连接的推荐方法是通过将回调附加到连接事件来等待连接准备就绪,例如:

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

关于javascript - Socket.io 与本地客户端。 Origin null 和 Access-Control-Allow-Origin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11703026/

相关文章:

javascript - JS :Select and move a specific div to front

javascript - 按天和项目总计分组,但输出项目名称作为键

node.js - 如何在nodejs中将Uint8Array视频转换为帧

html - 替代套接字 IO 客户端

javascript - Google map 对 Sencha Touch 2 中的事件不敏感

c++ - 在服务器上使用不同的端口号

session 中的 PHP pfsockopen

c# - C#套接字服务器如何取消卡在socket.accept()中的线程

php - 通过php执行node js文件

javascript - "use strict"在 JavaScript 中做了什么,背后的原因是什么?