2011-06-08 19 views
22

के साथ websockets के बजाय xhr-polling पर वापस आती है मुझे websockets और socket.io में कोई समस्या है। जब मैं सॉकेट के साथ अपने नोड सर्वर से कनेक्ट करने का प्रयास करता हूं। यह प्रारंभ में वेबसाइकिलों का उपयोग करके कनेक्ट होता है लेकिन जब जल्द ही जेसनपी-मतदान में वापस आता है।क्रोम और सफारी socket.io

8 Jun 07:01:15 - Initializing client with transport "websocket" 
8 Jun 07:01:19 - Initializing client with transport "jsonp-polling" 
8 Jun 07:01:19 - Client 16630339180119336 connected 

यह Chrome & सफारी में होता है:

इस नोड Sever जब मैं कनेक्ट से उत्पादन होता है। मैंने नवीनतम सॉकेट.io संस्करण 0.6.17 में अद्यतन किया है और नोड 0.4.7 चल रहा हूं।

मैंने जिथब और एसओ पर सुझाए गए अनुसार मेरी कुकीज़ और कैश को हटाने का प्रयास किया है, हालांकि समस्या बनी हुई है। साथ ही, जब मैं websockets को मजबूर करने का प्रयास करता हूं तो यह सत्र आईडी से पूरी तरह से कनेक्ट नहीं होता है।

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

+0

जेसनपी के उन्नयन के बाद से इसका मतलब है कि आप क्रॉस-डोमेन तरीके से सॉकेट.io का उपयोग कर रहे हैं। उसी वेबसाइट पर अपना वेबसाइकिल सर्वर चलाने का प्रयास करें – Raynos

+0

मैं इसे एक अलग आईपी पर चला रहा हूं क्योंकि मुझे पोर्ट 80 पर नोड चलाने की आवश्यकता है जो अपाचे के साथ मेरे वेब सर्वर पर संघर्ष का कारण बनता है। क्या websockets/flashsockets क्रॉस-डोमेन का उपयोग नहीं कर सकते हैं? – Kit

+0

मुझे नहीं पता कि वे क्या कर सकते हैं, मैं "नहीं" की अपेक्षा करता हूं। Freenode पर node.js पूछो। – Raynos

उत्तर

13

वेबसाइट्स एपीआई इस समय सभी ब्राउज़रों में डिफ़ॉल्ट रूप से समर्थित नहीं है (मेरे ज्ञान के अनुसार) यह क्रोमियम या फ़ायरफ़ॉक्स (डिफ़ॉल्ट सेटिंग्स को संपादित करने के बाद) पर परीक्षण करने का प्रयास करें और देखें कि क्या यह अभी भी वापस आता है XHRPolling करने के लिए।

मैं इसे एक अलग आईपी पर चला रहा हूं क्योंकि मुझे पोर्ट 80 पर नोड चलाने की आवश्यकता है जो अपाचे के साथ मेरे वेब सर्वर पर संघर्ष का कारण बनता है। क्या websockets/flashsockets क्रॉस-डोमेन का उपयोग नहीं कर सकते हैं?

अब यहां से बग के लिए 2 अलग कारणों से हो सकता है

  1. वेब/फ्लैश सॉकेट नहीं दूँगी यू Node.js ग्राहक से कनेक्ट जब तक या तो यू 81 या की तरह एक differnt पोर्ट निर्दिष्ट आप नोड को आने वाले अनुरोध को प्रॉक्सी करने के लिए विशेष रूप से अपाचे निर्दिष्ट करते हैं। एक आसान समाधान सिर्फ अपाचे से डेटा रिले Node.js आधारित HTTP सर्वर लेखन किया जा सकता है (और अपाचे एक differnt बंदरगाह पर चलाने के लिए तो 80 की स्थापना)

    This link बताता है कि कैसे करना है ... इस प्रक्रिया में आप Node.js कुछ ऐसा करने की जांच कर सकता है जैसे अनुरोध वेबसाईट/httpbrowser से है, यदि कोई http ब्राउज़र अपाचे के अनुरोध को अग्रेषित करता है या नहीं, यानी यदि वेब/फ्लैश सॉकेट से है तो तदनुसार सॉकेट को संभाल लें। या सवाल पर टिप्पणी के रूप में। Node.js. को प्रॉक्सी में APACHE निर्दिष्ट करें

  2. फ्लैशस्केट्स आपको पोर्ट 843 पर क्रॉसडोमेन नीति फ़ाइल की सेवा करने की आवश्यकता है, क्या आप वाकई एक क्रॉस डोमेन फ़ाइल प्रदान कर रहे हैं? (मुझे लगता है कि socket.io ऐसा करने के लिए, लेकिन अभी भी अपने हमेशा अच्छा जाँच करने के लिए इनबिल्ट कार्यक्षमता है।)

socket.io मुख्य वेबसाइट

पर कहा आदेश हर ब्राउज़र पर वास्तविक समय कनेक्टिविटी प्रदान करने के लिए , सॉकेट.आईओ एपीआई को प्रभावित किए बिना रनटाइम पर सबसे सक्षम परिवहन का चयन करता है।

  • WebSocket
  • पास Adobe Flash सॉकेट
  • AJAX लंबे मतदान
  • AJAX स्ट्रीमिंग
  • हमेशा के लिए
  • Iframe मल्टीपार्ट
  • JSONP मतदान

यह बहुत स्पष्ट है कि यह लौट जाएगा है AJAX लंबे मतदान के लिए यदि websockets अक्षम हैं और एडोब फ्लैश सॉकेट विफल रहता है कनेक्ट करने के लिए (यह पॉलिसी फाइल की अनुपलब्धता के कारण हो सकता है)।

यहां क्रॉस डोमेन फ़ाइल के लिए एक नमूना कोड है जिसे आप अपने कोड में शामिल कर सकते हैं और देख सकते हैं कि यह आपके सर्वर को वेबसाइकिल के साथ चलाता है या नहीं।

var net = require("net"); 

// Node.js 

var Policy = net.createServer(function(socket) 
{ 
    socket.setEncoding('utf8'); 
    socket.on('connect',function(){ 
     console.log("Policy Request"); 
     socket.end("<?xml version=\"1.0\"?><!DOCTYPE cross-domain-policy SYSTEM \"/xml/dtds/cross-domain-policy.dtd\"><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" secure=\"false\"/></cross-domain-policy>"); 
    }); 
}); 

Policy.listen(843); 
संबंधित मुद्दे