2017-01-29 10 views
7

मैं socket.io (1.5) का उपयोग करते हुए इस सरल Node.js Servercode है:Node.js Socket.io पृष्ठ ताज़ा कई कनेक्शन

var io = require('socket.io').listen(8080); 

io.on('connection', function(socket) { 

    console.log(' %s sockets connected', io.engine.clientsCount); 

    socket.on('disconnect', function() { 
     console.log("disconnect: ", socket.id); 
    }); 
}); 

तो मैं इस कोड und प्रेस F5 कई बार चलाने के लिए, कुछ मामलों में पुराना एक डिस्कनेक्ट होने से पहले नया कनेक्शन बनाया जाता है। कुछ समय बाद, मुझे लगता है कि यह हार्टबीट टिमआउट है, सभी कनेक्शन बंद हो जाएंगे। परिणाम देखें:

2 sockets connected 
3 sockets connected 
4 sockets connected 
5 sockets connected 
6 sockets connected 
7 sockets connected 
8 sockets connected 
9 sockets connected 
10 sockets connected 
11 sockets connected 
disconnect: 0h_9pkbAaE3ftKT9AAAL 
11 sockets connected 
12 sockets connected 
13 sockets connected 
14 sockets connected 
disconnect: oB4HQRCOY1UIvvZkAAAP 
14 sockets connected 
15 sockets connected 
disconnect: LiIN0oDVoqbePgxFAAAR 
15 sockets connected 
16 sockets connected 
17 sockets connected 
18 sockets connected 
disconnect: zxvk-uhWABHzmu1uAAAV 
18 sockets connected 
19 sockets connected 
20 sockets connected 
disconnect: FlboxgTzcjf6ScffAAAY 
20 sockets connected 
21 sockets connected 
disconnect: 9UGXbnzukfGX_UtWAAAa 
21 sockets connected 
disconnect: pAfXOEz6RocKZdoZAAAb 
21 sockets connected 
disconnect: DIhTyVgG2LYBawaiAAAc 
21 sockets connected 
disconnect: W4XOc1iRymfTE2U0AAAd 
21 sockets connected 
disconnect: WZzegGPcoGDNLRTGAAAe 
21 sockets connected 
22 sockets connected 
disconnect: KVR3-fYH0cz77BmgAAAC 
disconnect: ANQknhnxr4l-OAuIAAAD 
disconnect: KZE5orNx6u9MbOArAAAE 
disconnect: TS6LL3asXrcznfcPAAAF 
disconnect: SVNxS3I7KqecdqKhAAAG 
disconnect: IE2WE5Y0PJzvxgBfAAAH 
disconnect: v69bdJav9PjpThBGAAAI 
disconnect: mJKT1ggfOOTshZKgAAAJ 
disconnect: YlycVjdcWe0emCAcAAAK 
disconnect: MoIDJSzP_L-1RUwuAAAM 
disconnect: wAl0x5qwCkrnDDYQAAAN 
disconnect: eiTlPEk2Hx_X-L-fAAAO 
disconnect: KgkrXxzG_EpXOsPTAAAQ 
disconnect: Lvf3kK-6XXEbu3NWAAAS 
disconnect: -hOoGdYOIvVK04K_AAAT 
disconnect: 3EUmaAYpK-U3Ss9tAAAU 
disconnect: HQ6M98FebtKlU3OfAAAW 
disconnect: OwgrbRBYbS4j84nmAAAX 
disconnect: yN8FZAP4RjUNl2MeAAAZ 
disconnect: K9IFTjlgAWzdNfpUAAAf 

मेरा प्रश्न है: यह एक बग है या इस socket.io के सामान्य व्यवहार है? मैं कनेक्शन बाढ़ को कैसे रोक सकता हूं, साधारण F5 दबाकर?

बेस्ट सादर मार्क

+0

ब्राउज़र को रीफ्रेश करते समय ब्राउजर को खुले वेबसाकेट बंद करना चाहिए और फिर आपको डिस्कनेक्ट करना चाहिए। यदि ऐसा नहीं है, तो यह एक ब्राउज़र बग होगा। यदि ब्राउजर वेबसाकेट को तुरंत बंद नहीं करता है, तो socket.io देखेंगे कि सॉकेट अब सक्रिय नहीं है (दिल की धड़कन की वजह से) और सॉकेट अंततः साफ हो जाएगा। – jfriend00

+0

यह सभी वास्तविक ब्राउज़रों के साथ होता है। – mcbookwood

+0

जब आप F5 दबाते हैं और सर्वर अंततः डिस्कनेक्ट हो जाता है तो बीच कितना समय होता है? ऐसा लगता है कि आपकी गिनती में कुछ गलत हो सकता है क्योंकि जब आप डिस्कनेक्ट करते हैं तो आप नीचे जाने वाली गिनती नहीं दिखाते हैं। – jfriend00

उत्तर

10

मैं अपने खुद के परीक्षण ऐप बनाया गया है और क्या चल रहा है यह पता लगाने में सक्षम था।

यदि आप F5 को बहुत तेज़ी से कई बार दबाते हैं, तो यह अस्थायी रूप से क्रोम में कुछ अतिरिक्त सॉकेट.io कनेक्शन जमा करता है, लेकिन अपेक्षाकृत कम समय (शायद कुछ मिनट) में, यह ठीक हो जाता है और कनेक्ट किए गए सॉकेट की कुल गणना वापस आती है 1.

आगे परीक्षण के बाद, मुझे पता चला कि यह ब्राउज़र समस्या नहीं है। यह एक मुद्दा है कि socket.io कैसे socket.io कनेक्शन शुरू करता है। आप ग्राहक में इस बदलते हैं:

var socket = io(); 
इस के साथ

:

var socket = io({transports: ['websocket'], upgrade: false}); 

जो बलों केवल करने के लिए socket.io एक WebSocket का उपयोग और HTTP मतदान का उपयोग कभी नहीं, तो समस्या गायब हो जाता है।

तो, समस्या यह है क्योंकि socket.io के लिए डिफ़ॉल्ट व्यवहार सॉकेट.ओ कनेक्शन के http मतदान संस्करण से शुरू करना है। थोड़े डेटा का आदान-प्रदान करने के बाद, socket.io फिर वास्तविक वेबसाईट पर स्विच करने का प्रयास करेगा। यदि वह वास्तविक वेबसाकेट काम करता है, तो यह http मतदान कनेक्शन का उपयोग करना बंद कर देगा।

लेकिन, यदि आप मतदान और वास्तविक वेबसाकेट के बीच इस संक्रमण के बीच में F5 दबाते हैं, तो सॉकेट के लिए अभी तक कोई लगातार कनेक्शन नहीं है। यह जानने के लिए कि जिस वेब पेज पर यह संचार कर रहा था वह अब चला गया है। तो, यह सब कुछ कर सकता है कि कुछ समय बाद पता चल जाए कि उस वेब पेज से कोई आने वाला संचार नहीं है और इस प्रकार इसे सॉकेट.ओ कनेक्शन को साफ़ करना चाहिए (जब आप F5 दबाते हैं तो यह मतदान मोड में था)।

लेकिन, यदि आप बंद कर देते हैं कि इसके बाद के संस्करण क्लाइंट कोड के साथ प्रारंभिक मतदान मोड, तो यह केवल कभी एक असली WebSocket (कभी नकली मतदान मोड का उपयोग करता) का उपयोग करता है और ब्राउज़रों WebSocket की सफाई पर बहुत अच्छा है जब आप हिट हैं F5 इसलिए सर्वर ने या तो socket.io कनेक्शन स्थापित करना समाप्त नहीं किया है (जिस स्थिति में अस्थायी रूप से अनाथ होने के लिए अभी तक कोई कनेक्शन नहीं है) या यह पहले ही वेबसाकेट में परिवर्तित हो चुका है (और ब्राउजर इसे F5 पर साफ़ रूप से बंद कर देगा)।

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

+0

आह, ठीक है, यह समझ में आता है। और क्लाइंट और सर्वर पर सॉकेट कनेक्शन संपादित करने के बाद समस्या अब और नहीं होती है। इस स्पष्टीकरण के लिए धन्यवाद! – mcbookwood

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