Можно ли использовать Socket.IO в кросс-доменном режиме? Если да, то как? Возможность упоминается в Интернете, но примеры кода не приведены нигде.
Междоменное соединение в Socket.IO
Ответ 1
Цитирование socket.io FAQ:
Поддерживает ли Socket.IO междоменные подключения?
Абсолютно в каждом браузере!
Что касается этого: родные WebSockets являются междоменными по дизайну, socket.io служит для файла флэш-политики для междоменной флэш-связи, XHR2 может использовать CORS, и, наконец, вы всегда можете использовать JSONP.
Ответ 2
** Версия Socket.IO → 1.3.7 **
Можно ли использовать Socket.Io в кросс-доменном режиме? Да, абсолютно.
Если да, то как?
Вариант 1: принудительное использование только веб-узлов
По умолчанию веб-сокеты являются перекрестными доменами. Если вы заставляете Socket.io использовать это только как средство для подключения клиента и сервера, вам хорошо идти.
Серверная сторона
//HTTP Server
var server = require('http').createServer(app).listen(8888);
var io = require('socket.io').listen(server);
//Allow Cross Domain Requests
io.set('transports', [ 'websocket' ]);
Клиентская сторона
var connectionOptions = {
"force new connection" : true,
"reconnectionAttempts": "Infinity", //avoid having user reconnect manually in order to prevent dead clients after a server restart
"timeout" : 10000, //before connect_error and connect_timeout are emitted.
"transports" : ["websocket"]
};
var socket = io("ur-node-server-domain", connectionOptions);
Что это. Проблема? Не будет работать в браузерах (для клиентов), которые не поддерживают веб-узлы. С этим вы в значительной степени уничтожаете магию Socket.io, так как она постепенно начинает с длинного опроса для последующего обновления до websockets (если клиент поддерживает его.)
Если вы на 100% уверены, что все ваши клиенты будут иметь доступ с браузерами, совместимыми с HTML5, тогда вам будет хорошо.
Вариант 2: разрешить CORS на стороне сервера, разрешить Socket.io обрабатывать использование веб-узлов или длительный опрос.
В этом случае вам нужно только настроить настройку на стороне сервера. Клиентское соединение такое же, как всегда.
Серверная сторона
//HTTP Server
var express=require('express');
//Express instance
var app = express();
//ENABLE CORS
app.all('/', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
next();
});
Что это. Надеюсь, это поможет кому угодно.
Ответ 3
Просто введите свое удаленное доменное имя при создании сокета на стороне клиента:
var socket = io.connect('http://example.com:8080');
Ответ 4
Socket.io поддерживает междоменные подключения, но имейте в виду, что ваш файл cookie не будет передан серверу. Вам придется либо:
(1) придумать альтернативную схему идентификации (пользовательский токен или куки файл javascript), просто имейте в виду, что это не должен быть идентификатор сеанса, если вы не хотите подвергать себя риску захвата сеанса)
или (2) отправьте старый добрый HTTP-запрос JSONP на сервер сначала, чтобы получить файл cookie. Затем он будет передан с помощью рукопожатия сокета.
Ответ 5
Простота и безопасность!
В основном файле поместите его перед io.on('connection'), добавьте строки:
io.set('origins', 'yoursite.com:*');
io.on('connection', function (socket) {
Ответ 6
Да, да. Я применил cross domain socket.io, чтобы проверить, работает ли он.
<script src="http://your-nodejs-domain.com:3000/public/js/jquery.js"></script>
<script src="http://your-nodejs-domain.com:3000/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://your-nodejs-domain:3000');
$(document).ready(function(){
socket.on('test message', function(msg){
console.log("Got the message: " + msg);
});
});
</script>
Это должно работать нормально.
Ответ 7
Создайте свой сервер с помощью io следующим образом:
const server = require('http').createServer();
const io = require('socket.io')(server, {
origins:["127.0.0.1:8000"],
path: '/',
serveClient: false,
// below are engine.IO options
pingInterval: 20000,
pingTimeout: 5000,
cookie: false
});
io.on('connection', function(socket){
console.log("here new user welcom")
});
server.listen(3000,function(){
console.log('listening on *:3000')});
в массиве происхождений укажите действительное происхождение