Conexão entre domínios em Socket.IO
-
12-11-2019 - |
Pergunta
É possível usar o Socket.IO em vários domínios?Se sim, como?A possibilidade é mencionada na web, mas nenhum exemplo de código é fornecido em lugar nenhum.
Solução
citando o Socket.Io FAQ :
.faz soquete.io suporta conexões de domínio cruzado?
Absolutamente, em todos os navegadores!
quanto a ele: Websockets nativos são por design de domínio cruzado, Socket.io serve um arquivo de diretiva de flash para comunicação flash de domínio cruzado, XHR2 pode usar o CORS e, finalmente, você pode sempre usar o JSONP.
Outras dicas
** Versão do Socket.IO --> 1.3.7 **
É possível usar o Socket.Io em vários domínios? Sim absolutamente.
Se sim, como?
Opção 1:Forçar o uso apenas de Websockets
Por padrão, os websockets são entre domínios.Se você forçar o Socket.io a usar isso apenas como meio de conectar cliente e servidor, você estará pronto.
Lado do servidor
//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' ]);
Lado do cliente
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);
É isso.Problema?Não funcionará em navegadores (para clientes) que não suportam websockets.Com isso você praticamente mata a mágica que é o Socket.io, já que ele gradualmente começa com uma longa pesquisa para posteriormente atualizar para websockets (se o cliente suportar).
Se você tiver 100% de certeza de que todos os seus clientes acessarão com navegadores compatíveis com HTML5, você estará pronto.
Opção 2:Permita o CORS no lado do servidor, deixe o Socket.io decidir se deve usar websockets ou pesquisas longas.
Neste caso, você só precisa ajustar a configuração do servidor.A conexão do cliente é a mesma de sempre.
Lado do servidor
//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();
});
É isso.Espero que ajude mais alguém.
Basta inserir seu nome de domínio remoto ao criar o soquete do lado do cliente:
var socket = io.connect('http://example.com:8080');
Socket.Io suporta conexões entre domínios, mas tenha em mente que seu cookie não será passado para o servidor.Você terá que:
(1) venha com um esquema de identificação alternativo (um token personalizado ou um cookie de javascript - basta ter em mente que isso não deve ser o ID da sessão, a menos que você queira se colocar em risco de seqüestro de sessão)
.ou (2) Envie uma boa antiquada solicitação HTTP JSONP para o servidor primeiro para obter o cookie.Então será transmitido w / o aperto de mão da conexão do soquete.
Fácil e segurança!
No arquivo principal coloque-o antes de io.on('connection'), adicione as linhas:
io.set('origins', 'yoursite.com:*');
io.on('connection', function (socket) {
Sim.Implementei o socket.io entre domínios para testar se funciona.
<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>
Isso deve funcionar bem.
crie seu servidor por io assim:
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')});
na matriz de origens especifique uma origem válida