2012-01-23 17 views

Respuesta

27

Citando las socket.io FAQ:

¿Soporta Socket.IO conexiones entre dominios?

¡Absolutamente, en todos los navegadores!

cuanto a cómo lo hace: WebSockets nativas son entre dominios por diseño, socket.io sirve un archivo de política de flash para el flash de comunicación entre dominios, XHR2 puede utilizar CORS, y finalmente siempre se puede utilizar JSONP.

+2

En realidad tengo algunos problemas con las conexiones socket.io de Cross Domain. Cuando socket.io revierte a XHR-Polling/Ajax, socket.io intenta realizar solicitudes al dominio actual /socket.io/1, esto provoca un can not '*** onClose ***' en *** null ** *. Buscar en Google este error trae un par de problemas de github, pero nada que se aplique a mi situación (** ya que creo que es un problema de configuración, no un error **). –

+1

Esta respuesta es muy anticuada. Los navegadores implementan protecciones del mismo origen en webSockets como lo hacen para las llamadas Ajax. Si desea que se permita una conexión cross origin socket.io, debe habilitarla explícitamente en su servidor socket.io. – jfriend00

+0

El enlace está muerto. –

16

Simplemente inserte su nombre de dominio remoto al crear el socket de cliente:

var socket = io.connect('http://example.com:8080'); 
+0

Respuesta demasiado antigua. io.connect no es una función. –

+1

'io.connect' todavía debería estar funcionando (2016): http://socket.io/docs/#using-with-express-3/4. También vea socket.io/docs/client-api/: "' connect' Disparó después de una conexión exitosa. " – vinyll

6

Socket.io soporta conexiones entre dominios, pero tenga en cuenta que su cookie no se pasa al servidor. Tendrás que:

(1) crear un esquema de identificación alternativo (un token personalizado o una cookie de JavaScript, solo ten en cuenta que esta no debe ser la identificación de la sesión, a menos que quieras ponerte en riesgo de secuestro de sesión)

o (2) envíe primero una solicitud HTTP JSONP al servidor para obtener la cookie. Luego se transmitirá con el protocolo de enlace de conexión del zócalo.

2

¡Fácil y seguro!

En el lugar principal de archivo antes io.on ('conexión'), agregue las líneas:

io.set('origins', 'yoursite.com:*'); 

io.on('connection', function (socket) { 
1

sí lo hace. He implementado socket.io de dominio cruzado para probar si 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> 

Eso debería funcionar bien.

+0

Tengo el mismo problema, pero no es wotk .. –

+0

podría dar el código completo de la aplicación server.js – zero8

12

** Versión Socket.IO -> 1.3.7 **

¿Es posible el uso de Socket.Io de manera dominios? Sí, absolutamente.

Si es así, ¿cómo?

Opción 1: Uso de la Fuerza de WebSockets única

Por defecto, websockets son dominios. Si fuerza a Socket.io a usarlo solo como medio para conectar el cliente y el servidor, está listo para funcionar.

lado del 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 del 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); 

Eso es todo. ¿Problema? No funcionará en navegadores (para clientes) que no admitan websockets. Con esto matas casi la magia que es Socket.io, ya que gradualmente comienza con una larga encuesta para actualizar más tarde a websockets (si el cliente lo admite).

Si estás 100% seguro de que todos tus clientes accederán con Navegadores compatibles con HTML5, entonces estás listo para empezar.

Opción 2: Permitir CORS en el lado del servidor, deje que Socket.io controle si usar websockets o largo sondeo.

Para este caso, solo necesita ajustar la configuración del lado del servidor. La conexión del cliente es la misma de siempre.

lado del 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(); 
}); 

Eso es todo. Espero que ayude a alguien más.

+0

Usted señor, son el jefe! – tanwaniniranjan

+2

@tanwaniniranjan contento de que pueda ayudarte^_^(aunque yo soy la 'jefa', jeje). – Chayemor

+1

jeje, ¡bien! Usted señora, es el jefe :) – tanwaniniranjan

Cuestiones relacionadas