दिलचस्प पोस्ट
एंड्रॉइड डेटाबेस मौजूद होने पर प्रश्न! पटरियों पर रूबी में, स्ट्रिंग वर्ग को बढ़ाने के लिए, कोड को कब रखा जाना चाहिए? कैसे जावा में int को पूर्णांक में बदलने के लिए? क्यों "वापसी list.sort ()" वापस क्यों नहीं, कोई सूची नहीं? <> सूची में पिछले मूल्यों को ओवरराइट करने के लिए <> सूची में एक नया मान क्यों जोड़ता है <> जांचें कि कोई तत्व एक सरणी में मौजूद है या नहीं मैं CoffeeScript के लिए Rails 3.1 में "-bare" विकल्प का उपयोग कैसे कर सकता हूं? आईफ्रेम jQuery में एक तत्व का चयन करना Xcode 8 को अद्यतन करने के बाद लेआउट मुद्दे यादृच्छिक संख्या पीढ़ी के लिए सबसे सुरक्षित बीज क्या है? अजगर लिपि में एक पासवर्ड छिपा रहा है (केवल असुरक्षित अस्पष्टता) साझा होस्टिंग पर जादू के भाव कैसे बंद करें? जावा में एक कन्स्ट्रक्टर निजी हो सकता है? पायथन में सप्ताह संख्या कैसे प्राप्त करें? आर आकृति खिड़की में बेस और जीजीप्लॉट ग्राफिक्स को मिलाएं

पृष्ठों के बीच एक वेबसॉकेट कनेक्शन को कैसे बनाए रखा जाए?

मेरी एक स्क्रिप्ट पर मुझे यह कोड है:

var webSocket = window.WebSocket || window.MozWebSocket; window.ws = new webSocket('ws://64.121.210.140:2585/consoleappsample', 'my-protocol'); 

जो ठीक काम करता है हालांकि, जब उपयोगकर्ता पृष्ठ को बदलता है, तो मुझे कनेक्शन पुन: स्थापित करना होगा। मेरा मानना ​​है कि यह मेरे कोड में समस्याएं पैदा कर रहा है क्योंकि अगर ग्राहक सर्वर को डेटा भेजता है और फिर पृष्ठों को बदलता है, तो डेटा प्राप्त नहीं हो सकता है और दौड़ परिस्थितियां हो रही हैं।

मैंने window.ws को वैश्विक दायरे में रखने की कोशिश की लेकिन यह समस्या को ठीक करने में प्रतीत नहीं हुआ। क्या पेजों के बीच रहने के लिए वेबसॉकेट कनेक्शन के लिए कोई रास्ता नहीं है, इसलिए कनेक्शन को लगातार पुनः स्थापित करने की आवश्यकता नहीं है?

वेब के समाधान से एकत्रित समाधान "पृष्ठों के बीच एक वेबसॉकेट कनेक्शन को कैसे बनाए रखा जाए?"

आपके द्वारा वर्णित वैश्विक क्षेत्र हमेशा जावास्क्रिप्ट प्रसंग से संबंधित है, और प्रत्येक विंडो के लिए एक संदर्भ बनाया गया है (और जब दस्तावेज़ को स्मृति से उतार दिया जाता है तो नष्ट हो जाता है)। इसलिए, आपका प्रयास बेकार है: उपयोगकर्ता कनेक्शन पृष्ठ बदलते समय आप एक कनेक्शन खोले नहीं रख सकते। बेशक, आप अपने वेबपैक्शन को "एकल पृष्ठ" एप्लीकेशन के रूप में देख सकते हैं, जहां सभी डेटा XMLHttpRequest / ajax / WebSocket का उपयोग करके लोड किए जाते हैं। इसलिए, पेज छोड़ने का मतलब है कि आवेदन छोड़ना / बंद करना, और समझ में गर्तिका को बंद करना।

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

कहा, मैं @ ऑस्ट्राय के साथ सहमत हूं: आपका आवेदन हमेशा इस परिदृश्य को संभालने में सक्षम होना चाहिए – उपयोगकर्ता को कुछ नेटवर्क की समस्या हो सकती है और एक पल के लिए कनेक्शन खो दिया है, भले ही वह पृष्ठ नहीं छोड़ता है

आप एक साझा WebWorker में अपने WebSocket कनेक्शन बनाने का प्रयास कर सकते हैं जो समान डोमेन से कई पृष्ठों को निष्पादन संदर्भ साझा करने की अनुमति देता है। हालांकि, यह स्पष्ट नहीं है कि साझा श्रोता एक पृष्ठ भर में पुनः लोड या प्रतिस्थापित करते हैं: साझा वेब श्रमिक एक एकल पृष्ठ पुनः लोड, लिंक नेविगेशन में जारी रहें

इसके अलावा, साझा WebWorkers के पास सीमित ब्राउज़र समर्थन (वेबकिट और ओपेरा) है

अपडेट करें :

चूंकि एक साझा वेब कर्मचारी कई पेजों की सेवा कर सकता है, इसलिए कार्यान्वयन थोड़ा अधिक जटिल है, जो सामान्य वेब श्रमिकों के लिए है।

यहां एक साझा वेब कर्मचारी का उदाहरण है जो वेबसाकेट का उपयोग करता है और बीच में साझा कर सकता है

पहले एचटीएमएल:

 <!DOCTYPE html> <html> <body> <script> var worker = new SharedWorker("shared.js"); worker.port.addEventListener("message", function(e) { console.log("Got message: " + e.data); }, false); worker.port.start(); worker.port.postMessage("start"); </script> </body> </html> 

जावास्क्रिप्ट जो shared.js में साझा कार्यकर्ता को कार्यान्वित करता है:

 var ws = null var url = "ws://" + location.hostname + ":6080" self.addEventListener("connect", function(e) { var port = e.ports[0] port.addEventListener("message", function(e) { if (e.data === "start") { if (ws === null) { ws = new WebSocket(url); port.postMessage("started connection to " + url); } else { port.postMessage("reusing connection to " + url); } } }, false); port.start(); }, false); 

मैंने सत्यापित किया है कि यह क्रोम 52 में काम करता है

दुर्भाग्य से एसएपी आवेदन में अपनी साइट को बदलने के बिना साफ समाधान केवल एक सेवावापर के जरिये प्राप्त किया जाता है क्योंकि यह पृष्ठभूमि में काम करता है (टैब बंद भी होता है) और यह कई टैब की समस्याओं को भी हल करता है मैंने कहा "दुर्भाग्य से" क्योंकि वे अभी भी अधिकांश ब्राउज़रों के साथ संगत नहीं हैं I मैंने अपने द्वारा मिलकर एकमात्र समाधान सर्वर साइड पर सॉकेट चैनल समूहबद्ध किया है, और पृष्ठ बदलकर खो गए संदेशों को पकड़ने के लिए एक कतार बनाएं। इस मामले में आपके पास आभासी चैनल हैं।