यही कारण है कि वेब कोड करीब 1006 के साथ बंद हो गया


92

मैं कारण वेबसोकेट्स को बंद करना चाहता हूं, इसलिए मैं उपयोगकर्ता को सही संदेश दिखा सकता हूं।

मेरे पास है

sok.onerror=function (evt) 
     {//since there is an error, sockets will close so...
       sok.onclose=function(e){
           console.log("WebSocket Error: " , e);}

कोड हमेशा 1006 है और कारण हमेशा "" है। लेकिन मैं अलग-अलग बंद करने के कारणों को बताना चाहता हूं।

उदाहरण के लिए कॉमन लाइन एक त्रुटि कारण देती है: "आप इसे हटा नहीं सकते, क्योंकि डेटाबेस आपको नहीं देगा"। लेकिन क्रोम के कंसोल पर, कारण अभी भी "" है।

अलग-अलग समापन कारणों को बताने का कोई और तरीका?


मुझे लगता है कि यह इस कारण से है कि सर्वर कैसे जुड़े / डिस्कनेक्ट किए गए ईवेंट को हैंडल कर रहा है। मैं निश्चित रूप से नहीं कह सकता, लेकिन कनेक्शन समापन को सर्वर पर कोड के साथ भी सही ढंग से नियंत्रित करने की आवश्यकता है। सर्वर पर कनेक्टेड / डिस्कनेक्ट किए गए तरीकों में निर्मित को ओवरराइड करने का प्रयास करें और देखें। मेरी धारणा केवल यह है कि आप इसे बंद कर रहे हैं, लेकिन सर्वर ठीक से बंद नहीं हो रहा है और इसलिए उचित बंद प्रतिक्रिया को रिले नहीं कर रहा है।
माइकल पिकेट द्वितीय

जवाबों:


124

क्लोज कोड1006 एक विशेष कोड है जिसका अर्थ है कि ब्राउज़र कार्यान्वयन के द्वारा कनेक्शन को असामान्य रूप से (स्थानीय रूप से) बंद कर दिया गया था।

यदि आपका ब्राउज़र क्लाइंट करीबी कोड की रिपोर्ट करता है 1006, तो आपको websocket.onerror(evt)विवरण के लिए घटना को देखना चाहिए ।

हालाँकि, Chrome शायद ही किसी करीबी कोड 1006कारण को जावास्क्रिप्ट पक्ष पर रिपोर्ट करेगा । यह WebSocket के दुरुपयोग को रोकने के लिए WebSocket कल्पना में ग्राहक सुरक्षा नियमों के कारण होने की संभावना है। (जैसे किसी डेस्टिनेशन सर्वर पर खुले पोर्ट के लिए स्कैन करने के लिए इसका उपयोग करना, या किसी इनकार-हमले के लिए बहुत सारे कनेक्शन उत्पन्न करना)।

ध्यान दें कि 1006अगर वेबसैट के लिए HTTP अपग्रेड के दौरान कोई त्रुटि होती है, तो क्रोम अक्सर एक करीबी कोड की रिपोर्ट करेगा (यह वेबसकेट तकनीकी रूप से "जुड़ा हुआ है" से पहले कदम है)। खराब प्रमाणीकरण या प्राधिकरण, या खराब प्रोटोकॉल उपयोग जैसे कारणों के लिए (जैसे कि एक सबप्रोटोकॉल का अनुरोध करना, लेकिन सर्वर स्वयं उसी उपप्रोकोल का समर्थन नहीं करता है), या यहां तक ​​कि एक वैबसाइट नहीं है जो सर्वर स्थान पर बात करने का प्रयास करता है ( जैसे कनेक्ट करने का प्रयास ws://images.google.com/)

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

ध्यान रखें कि WebSocket क्लोज़ कोड बहुत सख्ती से परिभाषित होते हैं, और क्लोज़ कारण वाक्यांश / संदेश लंबाई में 123 वर्णों से अधिक नहीं हो सकता (यह एक जानबूझकर WebSocket सीमा है)।

लेकिन सभी खो नहीं जाते हैं, यदि आप केवल डिबगिंग कारणों, क्लोजर के विवरण और इसके अंतर्निहित कारण के लिए यह जानकारी चाहते हैं, तो अक्सर क्रोम की जावास्क्रिप्ट कंसोल में उचित मात्रा में विवरण के साथ रिपोर्ट किया जाता है।


4
जोकिम, धन्यवाद, बहुत विस्तृत anser। अगर मैं sok.onerror=function (evt) {console.log(evt);}विवरण का उपयोग करता हूं तो मैं इतना नहीं हूं । एक reasonया कुछ भी नहीं । तो, कोई विकल्प नहीं है? मैं केवल उपयोगकर्ता को दिखाता हूं, something is wrong, or not connencted?इसलिए उपयोगकर्ता के अनुकूल नहीं, यह अच्छा होगा यदि उपयोगकर्ता "आप हटा नहीं सकते, डेटाबेस प्रतिबंधों का कारण" देख सकते हैं। कोई विकल्प? धन्यवाद
Slevin

आपको sok.oncloseइसके बजाय उपयोग करना चाहिए जो ट्रिगर करता है close event, इसमें है reasonऔर codeइसमें
इहाब खट्टाब

@IhabKhattab कि क्लोज़ कोड विशिष्ट होगा, और पास होने पर भी। होने sok.oncloseकई रास्तों के लिए काम करेंगे, लेकिन सभी रास्ते नहीं। विशेष रूप से खराब प्रोटोकॉल, खराब हैंडशेक त्रुटियां (जैसे कुछ स्थितियां जो करीबी कोड का कारण बन सकती हैं 1006)। क्या भविष्य में इसमें बदलाव होगा? शायद। लेकिन जब यह जवाब लिखा गया तो यह सच था।
जोकिम एरडेल्ट

@JoakimErdfelt क्षमा करें, मैं @slevin के बारे में सवाल का जवाब दे रहा था कि reasonवह वापस नहीं लौटा है जब उसने उपयोग किया तो onerrorमैं इंगित कर रहा था कि यह गुण codeऔर घटना नहीं होने के reasonलिए विशिष्ट है । इसलिए उसके बजाय इसका उपयोग करना बेहतर होगा, क्या मुझे कुछ याद आ रहा है? closeerroronclose
इहब खट्टब

@IhabKhattab हाँ, क्योंकि उनका प्रश्न त्रुटि कोड के बारे में विशिष्ट था 1006, जिसका विशेष अर्थ है, और वेबसोकेट कल्पना में विशेष हैंडलिंग, और जावास्क्रिप्ट वेबसोकेट एपी। कुछ 1006शर्तों के तहत कारण स्ट्रिंग / संदेश विशेष रूप से और जानबूझकर एपीआई में कहीं भी उजागर नहीं होते हैं। (जैसा कि उत्तर बताया गया है)। यह एपीआई में एक बग नहीं है, इसके केवल विभिन्न चश्मे और गैर-वेबसोकेट प्रयोजनों के लिए वेबस्कैट का दुरुपयोग करने के बारे में उनकी चिंताओं को संबोधित कर रहा है।
जोकिम एरडेल्ट

15

मेरे और संभवतः @BIOHAZARD मामले में यह था nginx proxy timeout। डिफ़ॉल्ट रूप से यह 60सॉकेट में गतिविधि के बिना सेकंड है

मैंने इसे 24 घंटों में बदल दिया nginxऔर इसने समस्या का समाधान कर दिया

proxy_read_timeout 86400s;
proxy_send_timeout 86400s;

इसके लिए धन्यवाद! यह मेरे मामले में 1006 त्रुटि का कारण है।
स्टीव हैनोव

11

ऐसा लगता है कि यह ऐसा मामला है जब क्रोम वेबसकेट मानक के अनुरूप नहीं है। जब सर्वर पास शुरू करता है और क्लाइंट को क्लोज फ्रेम भेजता है, तो क्रोम इसे एक त्रुटि मानता है और कोड 1006 और कोई कारण संदेश के साथ इसे JS साइड में रिपोर्ट करता है। मेरे परीक्षणों में, Chrome कभी भी सर्वर द्वारा आरंभ किए गए नज़दीकी फ़्रेमों (क्लोज़ कोड 1000) का जवाब नहीं देता है और यह सुझाव देता है कि कोड 1006 का अर्थ है कि Chrome अपनी आंतरिक त्रुटि की रिपोर्ट कर रहा है।

PS फ़ायरफ़ॉक्स v57.00 इस मामले को ठीक से हैंडल करता है और सफलतापूर्वक जेएस की तरफ सर्वर के कारण संदेश पहुँचाता है।


2

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

संपादित करें: इसे एक आसान डंडी फ़ंक्शन में बदल दिया!

let specificStatusCodeMappings = {
    '1000': 'Normal Closure',
    '1001': 'Going Away',
    '1002': 'Protocol Error',
    '1003': 'Unsupported Data',
    '1004': '(For future)',
    '1005': 'No Status Received',
    '1006': 'Abnormal Closure',
    '1007': 'Invalid frame payload data',
    '1008': 'Policy Violation',
    '1009': 'Message too big',
    '1010': 'Missing Extension',
    '1011': 'Internal Error',
    '1012': 'Service Restart',
    '1013': 'Try Again Later',
    '1014': 'Bad Gateway',
    '1015': 'TLS Handshake'
};

function getStatusCodeString(code) {
    if (code >= 0 && code <= 999) {
        return '(Unused)';
    } else if (code >= 1016) {
        if (code <= 1999) {
            return '(For WebSocket standard)';
        } else if (code <= 2999) {
            return '(For WebSocket extensions)';
        } else if (code <= 3999) {
            return '(For libraries and frameworks)';
        } else if (code <= 4999) {
            return '(For applications)';
        }
    }
    if (typeof(specificStatusCodeMappings[code]) !== 'undefined') {
        return specificStatusCodeMappings[code];
    }
    return '(Unknown)';
}

उपयोग:

getStatusCodeString(1006); //'Abnormal Closure'

{
    '0-999': '(Unused)',
    '1016-1999': '(For WebSocket standard)',
    '2000-2999': '(For WebSocket extensions)',
    '3000-3999': '(For libraries and frameworks)',
    '4000-4999': '(For applications)'
}

{
    '1000': 'Normal Closure',
    '1001': 'Going Away',
    '1002': 'Protocol Error',
    '1003': 'Unsupported Data',
    '1004': '(For future)',
    '1005': 'No Status Received',
    '1006': 'Abnormal Closure',
    '1007': 'Invalid frame payload data',
    '1008': 'Policy Violation',
    '1009': 'Message too big',
    '1010': 'Missing Extension',
    '1011': 'Internal Error',
    '1012': 'Service Restart',
    '1013': 'Try Again Later',
    '1014': 'Bad Gateway',
    '1015': 'TLS Handshake'
}

स्रोत (छोटेपन के लिए छोटे संपादन के साथ): https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes


1

मुझे nginx प्रॉक्सी के तहत क्लाइंट के रूप में क्रोम और गोलंग गोरिल्ला वेबसोकेट के रूप में क्रोम का उपयोग करते समय त्रुटि मिली है

और सर्वर से क्लाइंट तक हर x सेकंड हल की गई समस्या के लिए बस कुछ "पिंग" संदेश भेजना


0

यह आपका वेबसैट URL हो सकता है जिसका आप डिवाइस में उपयोग कर रहे हैं वे समान नहीं हैं (आप android / iphonedevice से अलग वेबसोकेट URL मार रहे हैं)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.