2012-08-11 15 views
15

काम करता है मैं इस Node.js सर्वर है:Socket.IO केवल स्थानीय रूप से

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

क्लाइंट पक्ष कोड:

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

समस्या यह है कि केवल स्थानीय रूप से काम कर रहा है है । ubuntu क्रोम पर मैं:

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

जबकि पर एक मैक, मैं एक ही फ़ाइल के लिए कोई प्राप्त त्रुटि हो रहा है ...

क्या समस्या हो सकती है पर कोई विचार?

+0

आपका क्लाइंट-साइड कोड क्या है? – ebohlman

+0

कृपया मेरा संपादन जांचें। –

उत्तर

32

किसी साइट के डोमेन को होस्ट करने के साथ ऐसा करने की ज़रूरत नहीं है, इसे उस URL से करना है जिसका उपयोग आप इसे एक्सेस करने के लिए कर रहे हैं।

भले ही "1 9 2.168.1.130" और "लोकलहोस्ट" उसी सर्वर पर हल हो जाएं, उन्हें अलग-अलग डोमेन माना जाता है।

नतीजतन, क्योंकि आप क्लाइंट साइड कोड है:

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

आप डोमेन स्थानीय होस्ट से कनेक्ट कर रहे। यदि क्लाउड कोड लोकहोस्ट द्वारा परोसा गया था तो आप ठीक हैं, लेकिन यदि आप क्लाइंट को किसी अन्य डोमेन से लोड कर रहे हैं (उदाहरण के लिए 1 9 2.168.1.130) तो आपको समस्याएं आती हैं। ब्राउज़र और सर्वर के परिप्रेक्ष्य से आप आसानी से उस सेवा तक पहुंचने का प्रयास कर रहे एक पूर्ण अजनबी बन सकते हैं।

समस्या के लिए ग्राहक के पक्ष सॉकेट निर्माण बदलने ठीक करने के लिए:

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

आप अपने समस्या हल हो जाना चाहिए था।

सच हालांकि, अगर आप अभी पूरी तरह से पैरामीटर को निकालने और चल रहा प्रयास करना चाहिए:

var socket = io.connect();

यह इसी तरह से जो कुछ डोमेन आप पर आधारित होते हैं लागू हो जाएगी, और यह दोनों स्थानीय होस्ट पर काम करेंगे, आईपी , और अंततः आपके द्वारा उपयोग किए जाने वाले डोमेन नाम।

+0

ओह लड़का ... sooo बेवकूफ !!! पूरी तरह से इसके बारे में भूल गया ... मेरा सवाल एक मिटाने के लायक है –

+8

नहीं, यह बनाना आसान है! प्रश्न अन्य समस्याओं की तरह दूसरों की मदद करेगा। – slifty

+1

यदि मुझे var socket = io.connect() के साथ पोर्ट नंबर निर्दिष्ट करने की आवश्यकता है तो क्या होगा; आप उसे कैसे करेंगे? – Caimen

2

ऐप का उपयोग करने के लिए app.listen (80) '80,' 192.168.1.130 ') में app.listen (80) को बदलें, इस तरह socket.io से आपके यूआरएल सही होना चाहिए। यह भी सुनिश्चित करें कि आप इसे अपने ब्राउज़र में 192.168.1.130 से एक्सेस कर लें, भले ही आप इसे स्थानीय मशीन पर आज़माएं।

+0

कोई भाग्य नहीं .. अभी भी वही त्रुटि है। मुझे यह भी नहीं लगता कि स्थानीय आईपी डालने का अच्छा विचार होगा क्योंकि मैं अपने सर्वर को अपने इंट्रानेट से बाहर पहुंचाना चाहता हूं। –

+0

thnx आदमी आपके सुझाव ने मेरी समस्या हल की :) – Mj1992

संबंधित मुद्दे