我遇到了来自页面的套接字IO连接问题,由nodeJs服务器生成,到另一个由Socket.IO监听的nodeJs服务器
这个想法包含两个任务: 由一台Express服务器生成HTML模板 由另一个快速服务器支持套接字io
这是server.js代码:
const app = require('express');
const util = require('util');
const http = require('http');
const fs = require('fs');
const debug = console.log;
const moment = require('moment');
const event = require('events').EventEmitter;
var server = app();
server.use(function (req, res, next) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
res.setHeader('Access-Control-Allow-Credentials', true);
next();
}
);
server.use(app.json());
server.use(app.urlencoded());
server.use(app.logger());
server.use(app.favicon());
server.use(app.static(__dirname + '/core'));
server.get('*', function (req, res, next) {
debug('Connection refused: \t' + req.url);
var r = (e.url.split('/')[2] == 'socket.io.js') ? server.st.socket : server.st.tmp; // Return TMP-HTML FILE OR SOCKET.IO JS FILE FOR CLIENT
res.send(r);
res.end();
});
server.st = {
socket: fs.readFileSync('./socket.io.js', 'utf-8')
tmp: fs.readFileSync('./tmp.html', 'utf-8')
}
server.listen(81);
*******************************************************************************
//Creating SOCKET server
io = require('socket.io').listen(82);
io.configure(function () {
io.set('log level', 1);
io.set('origin', '*');
});
io.sockets.on('connection', function (socket) {
debug('IT IS WORK')
})
这是tmp.html代码:
<!DOCTYPE html>
<html>
<head>
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost:82');
</script>
</head>
<body>
</body>
默认为客户端的Socket.io.js
这是客户端的错误
XMLHttpRequest cannot load http://localhost:82/socket.io/?EIO=2&transport=polling. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:81' is therefore not allowed access.
这有什么问题?
答案 0 :(得分:5)
答案是:
必须支持套接字的HTTP服务器,在库存套接字选项中有默认的原始设置,不能通过var IO configurate,manager.js在778行(v0.9)中更改,你必须写入这样的原始选项: headers ['Access-Control-Allow-Origin'] ='*'; OR
解决方案的最佳方式是:
必须支持套接字的HTTP服务器,使用自己的侦听器绑定地址,使用socket.io.js文件创建请求此隧道的套接字beetwen客户端,我从localhost:81获取.. 这就是为什么我问自己的问题:“为什么我从服务器获取套接字客户端文件,这与套接字服务器无关?” 并改变了
<script src="http://localhost:82/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost:82');
</script>
它有效。 THX,来自俄罗斯的热爱。再见。
答案 1 :(得分:0)
您正在使用端口81创建快速套接字,然后在端口82上为socket.io创建另一个套接字,然后从前端尝试从快递加载socket.io.js而不提供它(你应该将socket.io绑定到与express相同的服务器上,然后你试图连接到http
协议到端口82--这被认为是另一个域,并且将失败为CORS。
不要试图逐个敲打代码并期望它能够工作,你必须先了解它的作用,然后才能使用它,否则你就不会走得太远。
请在官方网站上关注socket.io的示例:http://socket.io/#how-to-use
更新:根据您在评论中提到需求,您需要另一个域,您可能需要检查其他两个选项:从提供htmls的域代理WS流量或使用在CORS中做得很好的替代方案,如 SockJS 强>