2012-08-11 31 views
15

tengo este Node.JS servidor:Socket.IO sólo funciona localmente

var app = require('express')(); 
var server = app.listen(80); 
var io = require('socket.io').listen(server); 
var posx = 10; 
var posy = 10; 

app.get('/', function (req, res) { 
    res.sendfile(__dirname + '/index.html'); 
}); 

io.sockets.on('connection', function (socket) { 
    socket.emit('start', { 
     x: posx, 
     y: posy 
    }); 

    socket.on('newpos', function (data) { 
     posx = data["x"]; 
     posy = data["y"]; 
     socket.broadcast.emit('move', { x: posx, y: posy }); 
    }); 
}); 

del lado del cliente CÓDIGO:

  var socket = io.connect('http://localhost'); 

      socket.on('start', function (data) { 
       $("#pointer").animate({ 
        'top': data["y"], 
        'left': data["x"] 
       }, 0); 
      }); 

      socket.on('move', function (data) { 
       $("#pointer").animate({ 
        'top': data["y"], 
        'left': data["x"] 
       }, "slow"); 
      }); 

      $("#pointer").draggable({ 
       stop: function(event, ui) { 
        var pos = $("#pointer").position(); 

        socket.emit('newpos', { 
         'x': pos.left, 
         'y': pos.top 
        }); 
       } 
      }); 

El problema es que parece que sólo se trabaja a nivel local . en Ubuntu cromo me sale:

XMLHttpRequest cannot load http://localhost/socket.io/1/?t=1344711676473. Origin http://192.168.1.130 is not allowed by Access-Control-Allow-Origin. 

Si bien en un Mac, estoy teniendo un error de GET para el mismo archivo ...

Cualquier idea sobre lo que podría ser el problema?

+0

¿Cuál es el código del lado del cliente? – ebohlman

+0

por favor revisa mi edición. –

Respuesta

32

El dominio de un sitio no tiene que ver con dónde está alojado, tiene que ver con qué URL está utilizando para acceder a él.

Incluso si "192.168.1.130" y "localhost" se resuelven en el mismo servidor, se consideran dominios diferentes.

Como resultado de ello, porque usted tiene el código del lado del cliente:

var socket = io.connect('http://localhost'); 

Se está conectando a la dominio localhost. Si el servidor local sirvió el código del cliente, está bien, pero si está cargando el cliente desde otro dominio (por ejemplo, 192.168.1.130), entonces tendrá problemas. Desde la perspectiva del navegador y del servidor, fácilmente podrías ser un completo desconocido al intentar acceder a ese servicio.

Para solucionar el problema del cambio de la creación de socket del lado cliente para:

var socket = io.connect('192.168.1.130');

usted debe tener su problema resuelto.

Realmente sin embargo, sólo debe eliminar el parámetro completo e intente ejecutar:

var socket = io.connect();

De esta manera se pondrá por defecto a cualquier dominio que se basan en, y funcionará tanto en el servidor local, el IP y, finalmente, el nombre de dominio que utiliza.

+0

oh chico ... tan estúpido !!! Totalmente me olvidé de eso ... mi pregunta vale la pena borrar shah –

+8

¡No, es un error fácil de hacer! La pregunta ayudará a otros a enfrentar problemas similares. – slifty

+1

¿Qué ocurre si necesito especificar un número de puerto con var socket = io.connect(); ¿Cómo lo harías tú? – Caimen

2

Cambie app.listen (80) a app.listen (80, '192.168.1.130') para que use esa dirección IP, de ese modo sus URL de socket.io deberían ser correctas. También asegúrese de acceder desde 192.168.1.130 en su navegador incluso si lo prueba en la máquina local.

+0

sin suerte ... sigue siendo el mismo error. Además, no creo que sea una buena idea colocar la IP local ya que me gustaría que mi servidor esté accesible desde fuera de mi intranet. –

+0

thnx hombre su sugerencia resolvió mi problema :) – Mj1992