2013-10-03 7 views
6

मैं नोड सीखने की कोशिश कर रहा था और socket.io के साथ मैशप बनाना शुरू कर दिया था संदेश परिवहन शुरू हो गया है लेकिन मैंने कुछ परेशानी में भाग लिया है।सॉकेट.ओ संदेश संदेश कई बार फायरिंग

संदेश घटना कई बार फायरिंग कर रही है जिससे प्राप्तकर्ता के बॉक्स पर कई बार एक संदेश दिखाई दे रहा है। मैंने सॉकेट को exports.chat पर रूट किया है और यह सोच रहा था कि क्या समस्या हो रही है?

समस्या को कम करने के लिए: संदेश समय की संख्या को निकाल रहे हैं = ग्राहक के कनेक्शन के अनुक्रम। यही है, यदि कोई ग्राहक दूसरे से जुड़ता है, तो उसके संदेश दो बार आग लग जाएंगे। तीसरे से कनेक्ट क्लाइंट के लिए तीन बार।

यहाँ कोड का टुकड़ा है:

exports.chat = function(io, pseudoArray, req, res){ 
    res.render('chat', {title: 'ChatPanel.'}); 

     var users = 0; 

     io.sockets.on('connection', function (socket) { // First connection 
      users += 1; 
     // reloadUsers(io, users); 

      socket.on('message', function (data) { // Broadcast the message to all 
       if(pseudoSet(socket)) { 
        var transmit = {date : new Date().toISOString(), pseudo : returnPseudo(socket), message : data}; 
        socket.broadcast.emit('message', transmit); 
        console.log("user "+ transmit['pseudo'] +" said \""+data+"\""); 
       } 
      }); 

      socket.set('pseudo', req.session.user, function(){ 
       pseudoArray.push(req.session.user); 
       socket.emit('pseudoStatus', 'ok'); 
       console.log("user " + req.session.user + " connected"); 
      }); 

      socket.on('disconnect', function() { // Disconnection of the client 
       users -= 1; 
      // reloadUsers(); 
       if (pseudoSet(socket)) { 
        var pseudo; 
        socket.get('pseudo', function(err, name) { 
         pseudo = name; 
        }); 
        var index = pseudoArray.indexOf(pseudo); 
        pseudo.slice(index - 1, 1); 
       } 
      }); 
     }); 
}; 
+0

अपने डिस्कनेक्ट हैंडलर में: pseudo.slice वाला हिस्सा गेटर हैंडलर के अंदर होना चाहिए। –

उत्तर

5

सॉकेट.ओ कोड का पूरा हिस्सा बाहरी.चैट फ़ंक्शन के बाहर जाना है। सॉकेट आईओ को http/ऐप सर्वर से बांधना है, आपको इसे प्रत्येक अनुरोध में संभाल नहीं करना चाहिए।

संदेशों सक्रिय हो रहे हैं समय की संख्या = ग्राहक के कनेक्शन के अनुक्रम

क्या अनिवार्य रूप से हो रहा, हर बार एक नया अनुरोध आता है आप संदेश के लिए कोई ईवेंट हैंडलर पंजीकृत कर रहे है, इसलिए यह जैसे ही आपने चैट यूआरएल एक्सेस किया है उतनी बार निकाल दिया जाता है।

io.socket.on('message', function (data) {...}) 
+11

यह कैसे तय किया गया था? – sniper

+0

मुझे भी वही समस्या का सामना करना पड़ रहा है जिससे कोई मेरी मदद कर सकता है, यह समस्या कैसे हल हो गई, जब मैंने अपना कोड 'io.sockets.on ('message' 'में बदल दिया, यह –

1

मुझे लगता है कि इस दुर्व्यवहार क्योंकि आप एक आवेदन विशेष संदेश के रूप में "संदेश" में निर्मित/आरक्षित घटना नामों में से मुट्ठी में से एक का उपयोग करने के प्रयास कर रहे हैं है । पुष्टि करने के लिए, अपना ईवेंट नाम "message2" या कुछ और में बदलें और देखें कि समस्या दूर हो गई है या नहीं। मेरा मानना ​​है कि कम से कम "कनेक्ट", "डिस्कनेक्ट" और "संदेश" आरक्षित हैं। https://github.com/LearnBoost/socket.io/wiki/Exposed-events

1

तो मुझे भी यही समस्या थी।

socket.on('disconnect', function() { 
       socket.removeAllListeners('send message'); 
       socket.removeAllListeners('disconnect'); 
       io.removeAllListeners('connection'); 
      }); 

, डिस्कनेक्ट होने पर इसे कहते हैं यकीन नहीं की जरूरत नहीं है, लेकिन मैं यह कर - समाधान socket.on पर अपने सभी श्रोताओं को बंद करने के लिए है ('डिस्कनेक्ट') घटना, यह मेरा कोड कैसा दिखता है वैसे भी।

+0

पर काम नहीं करता है यह वास्तव में समस्या को हल नहीं करता है जब एक दूसरा ग्राहक लॉग ऑन करता है .. बस जब एक ग्राहक डिस्कनेक्ट हो जाता है। फिर भी मेरी समस्या ठीक नहीं हुई है: / – joe

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