2012-03-23 4 views
25

मैं दो क्लाइंट के साथ एक सिस्टम को लागू करने की कोशिश कर रहा हूं उनमें से एक संदेश भेजता है और दूसरा इसे प्राप्त करेगा। नीचे आकृति एक और अधिक बेहतर तरीके से यह समझा जाएगा:socket.io क्लाइंट सर्वर से संदेश प्राप्त नहीं कर रहा है

socket.io message communication chart

तो, ग्राहक 1 सर्वर से संदेश भेजने के लिए (और यह काम करता है), सर्वर एक "पुश" संदेश प्राप्त करता है और एक का उत्सर्जन करता है "पॉप" संदेश जिसे क्लाइंट 2 द्वारा उठाया जाना चाहिए। यहां समस्या यह है कि क्लाइंट 2 को कभी भी "पॉप" संदेश प्राप्त नहीं होता है। :(

यहाँ उन सभी के लिए कोड है।

SERVER.JS

var app = require('express').createServer() 
    , io = require('socket.io').listen(app); 

app.listen(999); 

app.get('/webclient', function (req, res) { 
    res.sendfile(__dirname + '/web.html'); 
}); 

app.get('/mobile', function (req, res) { 
    res.sendfile(__dirname + '/mobile.html'); 
}); 

io.sockets.on('connection', function (socket) { 
//  socket.emit('pop', { hello: 'world' }); 
    socket.on('push', function (data) { 
     console.log('push received, emitting a pop'); 
     socket.emit('pop', { hello: 'world' }); 
    }); 
}); 

ग्राहक 1 (उर्फ mobile.html)

<html> 
    <head> 
     <title> 
      Mobile 
     </title> 
     <script src="/socket.io/socket.io.js"></script> 
     <script src="https://ajax.googleapis.com/ajax/libs/mootools/1.4.5/mootools-yui-compressed.js" type="text/javascript"></script> 
     <script> 
      var socket = io.connect('http://localhost:999'); 
     </script> 
    </head> 
    <body> 
     <input type="button" name="act" id="push" value="message" /> 
     <script type="text/javascript" charset="utf-8"> 
      window.addEvent('domready', function() { 
       $('push').addEvent('click', function() { 
        socket.emit('push', { hello: 'world' }); 
       }); 
      }); 
     </script> 
    </body> 
</html> 

ग्राहक 2 (उर्फ वेब.html)

<script src = "/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect('http://localhost:999'); 
    socket.on('pop', function (data) { 
    console.log(data); 
    }); 
</script> 

मैं सिर्फ कारण है कि ग्राहक 2 "पॉप" संदेश प्राप्त नहीं होता है समझ में नहीं आ सकते हैं, मैं काफी socket.io करने और सामान्य रूप में Node.js मेरे लिए बहुत कुछ यांत्रिकी अभी भी थोड़ा अस्पष्ट हैं नई कर रहा हूँ , इसलिए मैं अपने नोबनेस के लिए पहले से माफी माँगता हूं। :)

चियर्स

-k-

+1

मुझे सॉकेट.io के साथ अनुभव नहीं हुआ है, लेकिन अगर मुझे गलत नहीं है तो 'सॉकेट' उसी सॉकेट को संदर्भित करेगा जिसे आपने संदेश प्राप्त किया था। क्या आप इसके बजाय 'io.sockets.emit' आज़मा सकते हैं? – pimvdb

+0

एक आकर्षण की तरह काम करता है!यदि आप एक उत्तर देना चाहते हैं तो मैं इसे सही के रूप में चिह्नित कर सकता हूं और आपको एक +1 प्राप्त कर सकता हूं :) – holographix

+5

+1 एक दिलचस्प प्रश्न के लिए अच्छी तरह से पूछा गया और स्वरूपित – beny23

उत्तर

15

समारोह .on के लिए पारित प्रारंभ (बंधन घटनाओं आदि) करने के लिए प्रत्येक सॉकेट के लिए कहा जाता है, और socket कि मौजूदा सॉकेट को दर्शाता है। यह push संदेश प्राप्त करने पर क्लाइंट 1 होगा, क्योंकि हैंडलर फ़ंक्शन उस socket की घटना से जुड़ा हुआ है - क्लाइंट 1 कनेक्ट होने पर आप उस फ़ंक्शन को बाध्य करते हैं (जहां socket क्लाइंट 1 को संदर्भित करता है)।

io.sockets सभी सॉकेट जुड़े हुए हैं, इसलिए आपके मामले में क्लाइंट 2 समेत।

socket.broadcast.emit('push', { hello: 'world' });

कौन सा अनिवार्य रूप से एक है कि संदेश उत्पन्न छोड़कर सभी जुड़ा ग्राहकों को संदेश भेजना होगा:

+1

यह काम करता है एक आकर्षण, धन्यवाद एक टन :) – holographix

12

एक अन्य पहलू है जो आप को ध्यान में ले सकता है का उपयोग है। क्लाइंट को फ़िल्टर करने/मूल सॉकेट पर अनावश्यक यातायात को कम करने के कार्य को हटा रहा है।

Socket.IO on GitHub - प्रसारण के तहत।

+0

यह भी दिलचस्प है, लेकिन अब मुझे अपने ग्राहकों का ट्रैक रखने की जरूरत है और मुझे एक निर्धारित ग्राहक को संदेश देने की ज़रूरत है, इसलिए मैंने एक और समाधान प्रबंधित किया है, लेकिन यह काम में आ सकता है भविष्य के लिए, धन्यवाद !! – holographix

+0

आप, महोदय, एक उत्थान के लायक हैं। यह बिना किसी परिणाम के 8 घंटों के बाद मेरे लिए काफी काम करता है !! – mozcelikors