मैं MEAN स्टैक में सर्वर से भेजे गए ईवेंट का उपयोग कर रहा हूं। जब भी आवश्यक हो मैं सर्वर से क्लाइंट तक डेटा पुश करने में सक्षम हूं।

लेकिन एक बात मैंने देखी कि भले ही मैं सर्वर को मारने वाला एकमात्र क्लाइंट हूं। मेरे लिए एकाधिक श्रोता हैं और ईवेंट को 40 श्रोता कहने के लिए प्रसारित किया जाता है (यदि मैं क्लाइंट के लिए ४० बार पुन: कनेक्ट होने के लिए पर्याप्त प्रतीक्षा करता हूं)।

जब उपयोगकर्ता पुनः लोड करते हैं, तो एकाधिक श्रोता भी बन जाते हैं।

मैं श्रोताओं को 1 श्रोता प्रति ईवेंट प्रति ग्राहक कहने के लिए कैसे सीमित कर सकता हूं। क्या सर्वर से भेजे गए ईवेंट के साथ भी यह संभव है।

मैं कनेक्शन को तब तक खुला रखने की कोशिश कर रहा हूं जब तक उपयोगकर्ता वेबसाइट का उपयोग कर रहा है और केवल तभी बंद होता है जब ब्राउज़र/टैब बंद हो या क्लाइंट पुनः लोड करने का अनुरोध करता है।

नोट : स्ट्रीम एक EventEmitter ऑब्जेक्ट है जिसका उपयोग मैं ईवेंट पास करने के लिए करता हूं ताकि आवश्यक परिवर्तनों की निगरानी की जा सके और सर्वर भेजे गए ईवेंट के माध्यम से उपयुक्त डेटा भेजा जा सकता है।

const function = async (request: Request, response: Response) => {
    console.log("client connected to broadcasting channel")
    console.log("listeners : " , stream.listenerCount('event-L'))
    response.writeHead(200, {
        'Content-Type': 'text/event-stream',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive',
        "X-Accel-Buffering": "no"
    });
    response.flushHeaders();

    stream.on('event-L', (event, data) => {
            console.log("Broadcasting event-L")
            response.write('event: ' + event + '\n' + 'data:' + JSON.stringify(data) + '\n\n')
        }
    })


    stream.on('event-U', (event, data) => {
            console.log("Broadcasting event-U.")
            response.write('event: ' + event + '\n' + 'data:' + JSON.stringify(data) + '\n\n')
        }

    })

    response.on('close', () => {
        console.log('client dropped me');
        response.end();
    })
}
0
Bikash Singh 15 जिंदा 2020, 15:24

1 उत्तर

सबसे बढ़िया उत्तर

जब क्लाइंट सॉकेट बंद करता है, तो आपको सर्वर साइड रिस्पांस ऑब्जेक्ट को बंद करना होगा जो इसे सर्विस कर रहा था।

कम से कम सीधे http पैकेज का उपयोग करते समय, कोड कुछ इस प्रकार है:

request.connection.on("close", function(){
  response.end();
  //Any other clean up, e.g. clearInterval() for any timers.
  console.log("Client closed connection. Aborting.");
  });

इसे मेरी पुस्तक के पृष्ठ 25 से कॉपी किया गया था, HTML5 SSE के साथ डेटा पुश ऐप्स।

https://stackoverflow.com/a/59041709/841830 पर Express.js के लिए एक उदाहरण है, जिसे वे लिखते हैं वह क्योंकि:

response.on('close', () => {
  console.log('client dropped me');
  //Any other clean up
  response.end();
  });

मान लें कि request.connection और response एक ही वस्तु हैं, तो यह वही कोड है, और इसलिए एक्सप्रेस के लिए बिल्कुल भी विशिष्ट नहीं है।

प्रश्नाधीन कोड के आधार पर अद्यतन करें

आपके stream.on() कॉल किसी ईवेंट में श्रोता जोड़ रहे हैं। इसलिए वे "क्लीन अप" का हिस्सा हैं जो आपको क्लाइंट के डिस्कनेक्ट होने पर करना होता है। अर्थात।

response.on('close', () => {
  console.log('client dropped me');
  response.end();
  stream.off('event-L', eventLHandler);
  stream.off('event-U', eventUHandler);
  })

देखें https://nodejs.org/api/events.html#events_emitter_off_eventname_listener

ध्यान दें कि आपको ईवेंट हैंडलर फ़ंक्शन को कैसे निर्दिष्ट करने की आवश्यकता है, इसलिए अनाम कार्यों का उपयोग नहीं किया जा सकता है। दो ईवेंट हैंडलर रखने के लिए अपने कोड को दोबारा दोहराएं (जो एक तर्क के रूप में प्रतिक्रिया लेते हैं)।

0
Darren Cook 16 जिंदा 2020, 14:24