ग्राहक कनेक्ट करने में विफल रहने के कारण

कनेक्शन विफल होने पर ग्राहक आमतौर पर दो प्रकार की त्रुटियाँ दिखाएगा, connection refuse और connection timeout

connection refuse (कनेक्शन अस्वीकृत)

आम तौर पर कारण निम्नलिखित होते हैं:

  1. ग्राहक द्वारा कनेक्ट किया गया पोर्ट गलत है
  2. ग्राहक द्वारा कनेक्ट किया गया डोमेन या आईपी गलत है
  3. यदि ग्राहक ने डोमेन का उपयोग किया है, तो डोमेन गलत सर्वर आईपी को इंगित कर सकता है
  4. सर्वर ने सीडीएन आदि त्वरक प्रॉक्सी का उपयोग किया है, जिसके कारण कनेक्शन का वास्तविक आईपी अपेक्षित आईपी से भिन्न है
  5. सर्वर चालू नहीं है या पोर्ट सुन नहीं रहा है
  6. नेटवर्क प्रॉक्सी सॉफ़्टवेयर का उपयोग किया गया है
  7. सर्वर सुनने वाला आईपी और एक्सेस पता एक ही पते के क्षेत्र में नहीं हैं। उदाहरण के लिए, यदि सर्वर 127.0.0.1 पर सुन रहा है, तो ग्राहक केवल 127.0.0.1 के माध्यम से कनेक्ट कर सकता है, स्थानीय नेटवर्क आईपी या बाहरी आईपी के माध्यम से नहीं। सुझाव दिया जाता है कि सुनने के पते को 0.0.0.0 पर सेट किया जाए, ताकि स्थानीय, आंतरिक और बाहरी नेटवर्क सभी कनेक्ट कर सकें।

connection timeout (कनेक्शन टाइमआउट)

आम तौर पर कारण निम्नलिखित होते हैं:

  1. सर्वर फ़ायरवॉल कनेक्शन को रोकता है, फ़ायरवॉल को अस्थायी रूप से बंद करने का प्रयास करें
  2. यदि यह एक क्लाउड सर्वर है, तो सुरक्षा समूह भी कनेक्शन स्थापित करने से रोक सकता है, प्रबंधन后台 में संबंधित पोर्ट खोलना आवश्यक है
  3. यदि पैनल जैसे बोटा का उपयोग किया गया है, तो बोटा में संबंधित पोर्ट खोलना आवश्यक है
  4. सर्वर मौजूद नहीं है या शुरू नहीं हुआ है
  5. यदि ग्राहक ने डोमेन का उपयोग करके कनेक्ट किया है, तो डोमेन गलत सर्वर आईपी को इंगित कर सकता है
  6. ग्राहक द्वारा访问 किया गया आईपी सर्वर का आंतरिक आईपी है, और ग्राहक और सर्वर एक ही स्थानीय नेटवर्क में नहीं हैं

cannot assign requested address (अनुरोधित पता आवंटित नहीं कर सकते)

ग्राहक के रूप में, प्रत्येक कनेक्शन स्थापित करते समय एक स्थानीय अस्थायी पोर्ट का उपयोग आवश्यक होता है, एक सर्वर के लिए डिफ़ॉल्ट रूप से उपलब्ध अस्थायी पोर्ट लगभग 2-3 हजार होते हैं, यदि विशिष्ट सर्वर के लिए स्थापित किए गए कनेक्शनों की संख्या इस मान से अधिक है, तो उपयोग योग्य पोर्ट आवंटित नहीं किए जाएंगे, जिससे यह त्रुटि उत्पन्न होती है।
स्थानीय अस्थायी पोर्ट की संख्या बढ़ाने के लिए आप कर्नेल पैरामीटर /etc/sysctl.conf में net.ipv4.ip_local_port_range को बदल सकते हैं, उदाहरण के लिए 10000 65535 पर सेट करें (स्थानीय पोर्ट का दायरा 10000 से 65535 तक सेट करना, अर्थात् स्थानीय पोर्ट की संख्या 55535 में बढ़ जाएगी), प्रभावी होने के लिए sysctl -p चलाएं।
इसके अलावा कनेक्शन डिस्कनेक्ट होने के बाद कनेक्शन TIME_WAIT स्थिति में बदल जाता है, फिर भी संबंधित स्थानीय पोर्ट को एक निश्चित समय के लिए अवरुद्ध करता है, इससे यह होता है कि यदि थोड़े समय में बड़े पैमाने पर (2-3 हजार से अधिक) कनेक्शन स्थापित किए जाते हैं, तो Cannot assign requested address त्रुटि भी उत्पन्न होगी, यदि ऐसा होता है तो कर्नेल को जल्दी से TIME_WAIT को पुनः प्राप्त करने के लिए सेट करके समाधान किया जा सकता है, कर्नेल ट्यूनिंग का संदर्भ लें।

ध्यान दें
स्थानीय पोर्ट संख्या की सीमा केवल ग्राहक पर लागू होती है, सर्वर पर स्थानीय पोर्ट की कोई सीमा नहीं है, जब तक संसाधन पर्याप्त हैं, सर्वर कनेक्शन संख्या को अनंत की तरह बनाए रख सकता है।

अन्य त्रुटियाँ

यदि उत्पन्न त्रुटि connection refuse और connection timeout नहीं है, तो आमतौर पर निम्नलिखित कारण होते हैं:

1. ग्राहक द्वारा उपयोग किया जाने वाला संचार प्रोटोकॉल सर्वर के साथ असंगत है।
उदाहरण के लिए, यदि सर्वर HTTP संचार प्रोटोकॉल है, तो ग्राहक WebSocket संचार प्रोटोकॉल का उपयोग करके कनेक्ट करने में असमर्थ होगा। यदि ग्राहक WebSocket प्रोटोकॉल का उपयोग करता है, तो सर्वर को भी WebSocket प्रोटोकॉल का होना आवश्यक है। यदि सर्वर HTTP प्रोटोकॉल का है, तो ग्राहक को HTTP प्रोटोकॉल का उपयोग करके कनेक्ट करना होगा।

यहाँ का सिद्धांत इस प्रकार है जैसे यदि आप किसी अंग्रेज़ी व्यक्ति से संवाद करना चाहते हैं, तो आपको अंग्रेज़ी का उपयोग करना होगा। और यदि आपको किसी जापानी व्यक्ति से संवाद करना है, तो आपको जापानी का उपयोग करना होगा। यहाँ भाषा संचार प्रोटोकॉल के समान है, दोनों (ग्राहक और सर्वर) को संवाद करने के लिए एक समान भाषा का उपयोग करना होगा, अन्यथा संचार संभव नहीं है।

संचार प्रोटोकॉल में असंगति के कारण सामान्य त्रुटियाँ:

WebSocket connection to 'ws://xxx.com:xx/' failed: Error during WebSocket handshake: Unexpected response code: xxx

WebSocket connection to 'ws://xxx.com:xx/' failed: Error during WebSocket handshake: net::ERR_INVALID_HTTP_RESPONSE

समाधान:
उपरोक्त दो त्रुटियों से पता चलता है कि ग्राहक WebSocket प्रोटोकॉल का उपयोग कर रहा है। सर्वर को भी WebSocket प्रोटोकॉल का होना आवश्यक है, सर्वर के सुनने के भाग में कोड को संचार करने के लिए WebSocket प्रोटोकॉल निर्दिष्ट करना होगा, जैसे निम्नलिखित:

यदि यह gatewayWorker है, तो सुनने का भाग कुछ इस तरह होगा:

// websocket प्रोटोकॉल, ताकि ग्राहक ws://... से कनेक्ट कर सके। xxxx के लिए पोर्ट न बदलें
$gateway = new Gateway('websocket://0.0.0.0:xxxx');

यदि यह Workerman है, तो यह होगा:

// websocket प्रोटोकॉल, ताकि ग्राहक ws://... से कनेक्ट कर सके। xxxx के लिए पोर्ट न बदलें
$worker = new Worker('websocket://0.0.0.0:xxxx');