एक बार एक endpoint दोनों भेजा है और एक बंद नियंत्रण फ्रेम प्राप्त हुआ है, कि endpoint WebSocket कनेक्शन के रूप में धारा 7.1.1 में परिभाषित बंद हो जाना चाहिए। (RFC 6455 7.1.2)
SRWebSocket उदाहरण नहीं _disconnect
यहाँ क्योंकि उस सर्वर से पहले ग्राहक के जवाब में एक बंद नियंत्रण फ्रेम करने के लिए प्राप्त हुआ है TCP कनेक्शन बंद कर करता है। वास्तव में, _disconnect
आईएनजी टीसीपी सॉकेट को फाड़ देगा इससे पहले कि क्लाइंट सर्वर पर अपना खुद का फ्रेम फ्रेम भी भेज सके, क्योंकि _disconnect
से पहले _pumpWriting
पर कॉल कर सकता है। सर्वर शायद पर्याप्त रूप से पर्याप्त प्रतिक्रिया देगा, लेकिन यह गैर-अनुरूप है, और आप इस तरह से चीजों को स्थापित करते समय स्थिति-अद्वितीय बंद कोड भेजने में सक्षम नहीं होंगे।
यह ठीक से साथ handleCloseWithData:
if (self.readyState == SR_OPEN) {
[self closeWithCode:1000 reason:nil];
}
dispatch_async(_workQueue, ^{
[self _disconnect];
});
में यह ब्लॉक बंद दोनों क्लाइंट और सर्वर द्वारा शुरू अनुरोधों को प्रबंधित की जाती है। यदि सर्वर पहला बंद फ्रेम भेजता है, तो विधि आपके द्वारा निर्धारित अनुक्रम के अनुसार चलती है, अंततः में closeWithCode:
के माध्यम से समाप्त हो जाती है, जहां ग्राहक अपने स्वयं के बंद फ्रेम के साथ जवाब देगा। फिर यह _disconnect
के साथ कनेक्शन को फाड़ने के लिए चला जाता है।
जब ग्राहक पहले फ्रेम भेजता है, तो closeWithCode:
एक बार टीसीपी कनेक्शन बंद किए बिना चलाता है क्योंकि _closeWhenFinishedWriting
अभी भी झूठा है। इस सर्वर समय अपने स्वयं के बंद फ्रेम, जो आम तौर पर closeWithCode:
फिर से चलाने में परिणाम होगा साथ प्रतिक्रिया करने के लिए अनुमति देता है, लेकिन यह है कि विधि के शीर्ष पर निम्नलिखित ब्लॉक के लिए:
if (self.readyState == SR_CLOSING || self.readyState == SR_CLOSED) {
return;
}
readyState पहले यात्रा पर बदल गया है क्योंकि closeWithCode:
का, इस बार यह आसानी से नहीं चलेगा।
इस काम को इरादे के रूप में बनाने के लिए एएमपी का बग फिक्स आवश्यक है, अन्यथा: सर्वर से बंद फ्रेम कुछ भी नहीं करता है। कनेक्शन अभी भी समाप्त हो जाएगा, लेकिन गंदे रूप से, क्योंकि सर्वर (दोनों ने अपने फ्रेम भेजे और प्राप्त किए हैं) सॉकेट को अपने अंत में तोड़ देंगे, और ग्राहक NSStreamEventEndEncountered:
के साथ प्रतिक्रिया देगा, जो आम तौर पर अचानक नुकसान के कारण स्ट्रीम त्रुटियों के लिए आरक्षित होता है कनेक्टिविटी की। एक बेहतर तरीका यह निर्धारित करना होगा कि फ्रेम कभी भी _innerPumpScanner
से handleCloseWIthData:
से क्यों नहीं निकलता है। ध्यान में रखने के लिए एक और मुद्दा यह है कि डिफ़ॉल्ट रूप से, close
केवल आरएफसी-गैर-अनुरूप कोड -1 के साथ closeWithCode:
पर कॉल करता है। इसने मेरे सर्वर पर त्रुटियों को फेंक दिया जब तक कि मैंने इसे स्वीकार किए गए मानों में से एक भेजने के लिए नहीं बदला।
सभी ने कहा कि: आपकी प्रतिनिधि विधि काम नहीं करती है क्योंकि आप close
पर कॉल करने के बाद प्रतिनिधि को सही तरीके से परेशान कर रहे हैं। close
में सब कुछ एक एसिंक ब्लॉक के अंदर है; जब आप didCloseWithCode:
का आह्वान करते हैं, तब तक कॉल करने के लिए एक प्रतिनिधि नहीं छोड़ा जाएगा, चाहे आप यहां और क्या करें।
यह स्थिति क्या है "अगर (! Self.webSocket)"? –
इसका मतलब है कि वेबस्केट को बंद होने पर बंद नहीं किया जा सकता है, क्योंकि तब यह –
नहीं खोलता है, मुझे हमेशा यह त्रुटि मिल रही है और भाषण में टेस्ट ऑडियो अवरोध प्राप्त कर रहा है, WebSocket कारण के साथ बंद [1000]: सॉकेट को मैन्युअल रूप से समाप्त करना कनेक्शन कोई सुझाव? –