2012-11-29 10 views
11

फ़ायरफ़ॉक्स में (कम से कम), यदि आप ईएससी हिट करते हैं, तो यह सभी खुले वेबसाकेट कनेक्शन बंद कर देगा। मुझे उस डिस्कनेक्शन को कैप्चर करने की आवश्यकता है और इसे फिर से उपलब्ध होने के बाद पुनः कनेक्ट करने का प्रयास करें।मैं वेबस्केट कनेक्शन बाधा कैसे पकड़ूं?

यहां कोड का एक उदाहरण है जिसे मैंने कार्यान्वित करने का प्रयास किया है, लेकिन कुछ भी नहीं जिसे मैं समझ सकता हूं, त्रुटि को पकड़ लेगा और मुझे इसे सुंदर तरीके से संभालने की अनुमति देगा।

कोड पर एक नज़र डालें: http://jsfiddle.net/w5aAK/

var url = "ws://echo.websocket.org"; 
    try { 
     socket = window['MozWebSocket'] ? new MozWebSocket(url) : new WebSocket(url); 
     socket.onopen = function(){ 
      console.log('Socket is now open.'); 
     }; 
     socket.onerror = function (error) { 
      console.error('There was an un-identified Web Socket error'); 
     }; 
     socket.onmessage = function (message) { 
      console.info("Message: %o", message.data); 
     }; 
    } catch (e) { 
     console.error('Sorry, the web socket at "%s" is un-available', url); 
    } 

setTimeout(function(){ 
    socket.send("Hello World"); 
}, 1000); 

अपने कंसोल पर बारी और उत्पादन को देखते हैं।

क्या मैं यहां कुछ गलत कर रहा हूं, या यह संभव नहीं है क्योंकि कनेक्शन जेएस स्क्रिप्ट के दायरे से बाहर चल रहा है?

कोई भी इनपुट सहायक होगा।

धन्यवाद!

+1

आप 'socket.send (बुलाना चाहिए)' 'भीतर onopen' कॉलबैक , क्योंकि 1 सेकंड के बाद कनेक्शन अभी भी स्थापित नहीं हो सकता है। – neevek

+1

मुझे इसके बारे में पता है और इसे संभालने का तरीका पता है, लेकिन यह सवाल नहीं है कि मैं पूछ रहा हूं। – Zach

+0

ईएससी-बटन समस्या फ़ायरफ़ॉक्स में तय होती है 27 – Tieme

उत्तर

5

आप socket.onclose ईवेंट में हैंडलर संलग्न कर सकते हैं। जब आप ईएससी हिट करते हैं और कनेक्शन बाधित होता है तो इसे कॉल किया जाएगा।

देखें: http://jsfiddle.net/w5aAK/1/

एक समस्या यह है कि आप के आसपास इस समय नहीं मिल सकता है कंसोल के लिए बाधित त्रुटि उत्पादन किया जा रहा है। कैप्चर करने का कोई तरीका नहीं है कि फिलहाल मुझे डर है।

+1

हाँ, यही वह है जिसे मैं डरता था, मुझे बस इसे सत्यापित करने की आवश्यकता थी। मेरे पास इसे संभालने के लिए पहले से ही 'ऑनक्लोस' ईवेंट है, लेकिन अपवाद को रद्द करने की उम्मीद कर रहा था। आपके सहयोग के लिए धन्यवाद! – Zach

+3

_ एक समस्या जो आप इस समय चारों ओर नहीं मिल सकती है, कंसोल पर आउटपुट होने वाली बाधित त्रुटि है। क्या किसी भी चश्मा या दस्तावेज़ में इसका संदर्भ है? –

1

आप इसे पकड़ नहीं सकते हैं और यह आपकी गलती नहीं है। यह फ़ायरफ़ॉक्स बग है। इसके लिए यहाँ वोट:

https://bugzilla.mozilla.org/show_bug.cgi?id=712329

मैं व्यक्तिगत रूप से समाधान के सभी प्रकार की कोशिश की:

ईवेंट हैंडलर्स ऑनअनलोड onbeforeunload OnClose try..catch कुछ js त्रुटि 3 पार्टी सेवाओं आदि से निपटने

आप अपनी सॉकेट को कंसोल करने के लिए लॉग इन कर सकते हैं, यह अनलोड से पहले बंद है, लेकिन एफएफ अलग सोचता है .. :(

समाधान ( जवाब देने के लिए सीधे जवाब नहीं है, लेकिन यह काम करता है):

यह एक बग है, तो आप को नहीं पकड़ सकते हैं, लेकिन यह जानकारी समाधान नहीं है। सभी तरह के पागल कामकाज के बाद और उस बग को पकड़ने की कोशिश करता है, मुझे अंत में यह काम मिल गया। यदि आप WebScokets के साथ काम करने के लिए socket.io का उपयोग करते हैं तो यह विभिन्न परिवहन तकनीकों के साथ काम कर सकता है। एक्सएच-मतदान फ़ायरफ़ॉक्स के साथ काम करता है।

if (/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent)) { //test for Firefox/x.x  or Firefox x.x (ignoring remaining digits); 
    socket = io.connect('//' + node_server + '/', { 
     transports: ['polling'] 
    }); 
} else { 
    socket = io.connect('//' + node_server + '/'); 
} 

मुझे क्या मदद की - आप भी मदद कर सकता है:

Web Socket support in Node.js/Socket.io for older browser

Define transport types on the client side

socket.io doens't work with transports: [ 'xhr-polling' ]

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