2012-08-11 8 views
15

ho questo Node.JS server di:Socket.IO funziona solo a livello locale

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 }); 
    }); 
}); 

CODICE CLIENTE LATERALE:

  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 
        }); 
       } 
      }); 

Il problema è che sembra funzionare solo a livello locale . su Ubuntu cromo ottengo:

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

Mentre su un Mac, sto avendo un errore di GET per lo stesso file ...

Qualche idea su ciò che il problema potrebbe essere?

+0

Qual è il tuo codice lato client? – ebohlman

+0

controlla la mia modifica. –

risposta

32

Il dominio di un sito non ha nulla a che fare con dove è ospitato, ha a che fare con quale URL si sta utilizzando per accedervi.

Anche se "192.168.1.130" e "localhost" si risolvono sullo stesso server, vengono considerati domini diversi.

Come risultato, perché hai il codice lato client:

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

Ci si connette al dominio localhost. Se il codice client è stato servito da localhost, stai bene, ma se stai caricando il client da un altro dominio (ad esempio 192.168.1.130), allora avrai dei problemi. Dal punto di vista del browser e del server potresti facilmente essere un estraneo completo cercando di accedere a quel servizio.

per risolvere il problema modificare la creazione del socket lato client per:

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

si dovrebbe avere il problema risolto.

Davvero, però, si dovrebbe rimuovere il parametro completamente e prova ad eseguire:

var socket = io.connect();

In questo modo sarà di default a qualsiasi dominio si sono basati su, e funzionerà sia su localhost, l'IP e infine il nome di dominio che usi.

+0

oh ragazzo ... mooooolto stupido !!! totalmente dimenticato che ... la mia domanda vale la pena eliminare lo shah –

+8

No, è un errore facile da fare! La domanda aiuterà gli altri ad affrontare problemi simili. – slifty

+1

Cosa succede se ho bisogno di specificare un numero di porta con var socket = io.connect(); come lo faresti? – Caimen

2

Modificare l'app.listen (80) in app.listen (80, '192.168.1.130') perché utilizzi quell'IP, in questo modo gli URL da socket.io dovrebbero essere corretti. Assicurati anche di accedervi da 192.168.1.130 nel tuo browser anche se lo provi sul computer locale.

+0

no fortuna .. ancora lo stesso errore. inoltre non penso sarebbe una buona idea mettere l'IP locale come vorrei che il mio server fosse accessibile dall'esterno della mia intranet. –

+0

thnx man il tuo suggerimento ha risolto il mio problema :) – Mj1992

Problemi correlati