Socket.io 跨域问题

Posted

技术标签:

【中文标题】Socket.io 跨域问题【英文标题】:Socket.io cross domain issue 【发布时间】:2017-08-15 11:58:26 【问题描述】:

我有一个在 apache 服务器中工作的前端 angularJS 应用程序(客户端),它的 API 调用被发送到在 NodeJS 中运行的后端应用程序(服务器)。现在我想在客户端和服务器之间建立一个套接字连接。 我正在使用 cors npm 模块解决跨域问题,但它不起作用。

我已经看到了几个解决方案,但没有一个对我有用。

这是我的服务器端代码:

var cors = require('cors')
var app = express();
var http = require('http');

app.use(cors(
origin: true,
credentials: true
));


var server = http.createServer(app);
var io = require('socket.io')(server);
io.on('connection', function(socket) 

console.log(":::::::::::::::::::::SOCKET:::::::::::::::::::::")

socket.on('message', function(data) 
    console.log(data); )
);

服务器在http://localhost:8000/工作

这是我的客户端代码:

function socket() 
        var socket = io.connect('http://localhost:8000/');
  return 
     on: function(eventName, callback) 
        socket.on(eventName, callback);
     ,
     emit: function(eventName, data) 
        socket.emit(eventName, data);
     ,
     getSocket: function() 
        return socket;
     ,
     removeAllListeners: function() 
        socket.removeAllListeners();
     
  ;
  

我在 angularJS 中创建了上述工厂,并在如下所示的函数中调用它:

var socket=PermitFactory.socket();
socket.emit('message', 'ssss');

我在浏览器控制台中得到的错误是:

socket-io.js:4948 GET http://localhost:8000/socket.io/?EIO=3&transport=polling&t=LhvWuIr 404(未找到)

在服务器控制台中:

GET /socket.io/?EIO=3&transport=polling&t=LhvUygM 404 18.881 ms - 1153

请帮忙!!!

【问题讨论】:

您的错误是否在控制台中说明了有关 CORS 的任何内容?? 没有。后端控制台中的唯一错误是 ==>GET /socket.io/?EIO=3&transport=polling&t=LhvhEJB 404 3.971 ms - 1153 【参考方案1】:

您收到 404 (Not Found) 这意味着问题出在您的 url 而不是 cors 上。

http://localhost:8000/ 服务器启动了吗?套接字服务器..如果是这样,那么wsswswss://localhost:8000/wss://localhost:8000/ 之前

【讨论】:

是的,服务器已启动。我尝试用 wss 替换 http .. 但不工作 你得到 404 这意味着 url 不可用 .. 套接字服务器未启用或什么【参考方案2】:

在你的服务器端脚本上允许跨域,把它放在 app.js 上

//Access-Control-Allow-Origin
app.use(function(req,res,next)
    res.header('Access-Control-Allow-Origin', '*');
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
    res.header("Access-Control-Allow-Credentials",true);
    res.header("Access-Control-Allow-Methods","POST,GET,OPTIONS");
    next();
);

app.use(cors());

谷歌浏览器插件允许跨源

https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=en

【讨论】:

谢谢。但是现在问题变成了这个==> XMLHttpRequest 无法加载localhost:8000/socket.io/…。当凭证标志为真时,不能在“Access-Control-Allow-Origin”标头中使用通配符“*”。因此,Origin 'localhost' 不允许访问。 XMLHttpRequest 的凭据模式由 withCredentials 属性控制。

以上是关于Socket.io 跨域问题的主要内容,如果未能解决你的问题,请参考以下文章

socket.io 跨域请求被阻止

跨域 Sails.js + Socket.io 授权

跨域socket.io 30秒后中断

vue-socket.io跨域问题的解决方法

Socket.io 跨域问题 - Access-Control-Allow-Origin 不允许来源

如何针对跨域的 PHP 会话 ID 对 Socket.IO 进行身份验证