2011-08-02 22 views
35

के साथ विशिष्ट क्लाइंट को संदेश भेजना मैं socket.io के साथ पागल हो रहा हूँ! दस्तावेज़ीकरण इतना बुरा है कि यह वास्तव में सच नहीं है।socket.io और खाली संदेश कतार

मैं socket.io

मेरे सर्वर साइड इस तरह दिखता है के साथ विशिष्ट ग्राहक के लिए एक राय भेजने के लिए चाहते हैं:

app.get('/upload', requiresLogin, function(request, response) { 
    response.render('upload/index.jade'); 
    io.sockets.on('connection', function (socket) { 
     console.log('SOCKET ID ' + socket.id); 
     io.sockets.socket(socket.id).emit('new', 'hello'); 
    }); 
}); 

और क्लाइंट साइड इस तरह दिखता है:

$(document).ready(function() { 
    var socket = io.connect('http://localhost:80/socket.io/socket.io.js'); 
    socket.on('new', function (data) { 
     console.log(socket.id); 
     console.log(data); 
     //$('#state').html(data.status); 
    }); 
}); 

लेकिन ग्राहक बस कुछ भी नहीं करता है। मैंने लगभग हर चीज की कोशिश की है। क्या कोई मुझे बता सकता है कि मैं क्या गलत कर रहा हूं, कृपया! :(

उत्तर

7

2 बातें

1) आप वास्तव में अपने io.sockets.on(..) बाहर अपने app/update मार्ग ग्राहकों के लिए कई श्रोताओं को जोड़ने को रोकने के लिए जगह चाहिए।

2) io.sockets.socket (आईडी); इस्तेमाल नहीं किया जाना चाहिए, यह socket.emit('new', 'hello')

+0

ठीक है, यह भी एक समस्या थी IO.connect ('http: // localhost: 80/socket.io/socket.io.js'); लेकिन जब मैं अपलोड के दौरान संदेश भेजना चाहता हूं तो क्या होगा? तो मुझे क्लाइंट आईडी को स्टोर करने और io.sockets.socket (socket.id) .emit ('new', 'hello') का उपयोग करने की आवश्यकता है; या नहीं? –

+0

जहां तक ​​मुझे पता है कि सॉकेट कनेक्शन फॉर्म के माध्यम से फ़ाइल अपलोड करते समय डिस्कनेक्ट नहीं किया गया है। – pkyeck

+0

ठीक है और आखिरी सवाल है। क्या यह संभव है कि संदेश कतार खाली हो जाए? जब मैं दृश्य को पुन: प्रस्तुत करता हूं तो मुझे सभी पुराने मालिश प्राप्त होते हैं ... –

52

किसी विशिष्ट क्लाइंट को संदेश भेजने के लिए प्रत्येक ऑब्जेक्ट में सर्वर से कनेक्ट होने वाले प्रत्येक को सहेजना चाहिए था।

var socketio = require('socket.io'); 
var clients = {}; 
var io = socketio.listen(app); 

io.sockets.on('connection', function (socket) { 
    clients[socket.id] = socket; 
}); 

फिर आप बाद में कुछ इस तरह कर सकते हैं:

सभी की
var socket = clients[sId]; 
socket.emit('show', {}); 
+0

जो काम नहीं करता है। मैंने एक साधारण परीक्षण किया है: var soc; io.sockets.on ('कनेक्शन', फ़ंक्शन (सॉकेट) { \t soc = सॉकेट; }); प्रत्येक मार्ग से बाहर। और मेरे अपलोड समारोह की तुलना में मैं का इस्तेमाल किया है soc.emit ('खबर', 'bla') कुछ नहीं होता .... –

+0

जैसा कि मैंने कहा पहले: आप घटनाओं जबकि एक फ़ाइल अपलोड नहीं भेज सकते। लेकिन यह विधियां काम करती हैं और जब आप संबंधित आईडी रखते हैं तो आप विशिष्ट ग्राहकों को संदेश भेज सकते हैं। – pkyeck

+0

: -/क्षमा करें मैंने आपको गलत समझा। तो किसी रूट क्लाइंट से किसी विशिष्ट क्लाइंट को संदेश ट्रिगर करने का कोई तरीका नहीं है? –

2

सबसे पहले, आप क्लाइंट की तरफ socket.id उपयोग नहीं कर सकते।

और फिर लाइन

var socket = io.connect('http://localhost:80/socket.io/socket.io.js');

को

var socket = io.connect('http://localhost:80/');

18

socket.io पर एक विशिष्ट ग्राहक को फ़ीडबैक भेजने के तरीके के एक जोड़े में शामिल हैं बदलने के लिए:

  • जैसा कि पी ने कहा है kyeck, एक वस्तु के लिए सभी ग्राहकों को बचाने के लिए, ताकि आप बाद में अपने मार्ग संचालकों में, उदाहरण के लिए इन विशिष्ट ग्राहकों के लिए भेज सकते हैं:

    var sessionsConnections = {}; 
    sio.on('connection', function (socket) { 
        // do all the session stuff 
        sessionsConnections[socket.handshake.sessionID] = socket; 
    }); 
    
  • या, का उपयोग socket.io कमरे के लिए समर्थन में बनाया गया है - एक करने के लिए प्रत्येक ग्राहक के लिए सदस्यता कनेक्शन पर कमरे और मार्ग संचालकों के भीतर इस कमरे के माध्यम से भेजने के लिए, उदाहरण के लिए:

    sio.on('connection', function (socket) { 
        // do all the session stuff 
        socket.join(socket.handshake.sessionID); 
        // socket.io will leave the room upon disconnect 
    }); 
    
    app.get('/', function (req, res) { 
        sio.sockets.in(req.sessionID).send('Man, good to see you back!'); 
    }); 
    

पावती:

http://www.danielbaulig.de/socket-ioexpress/#comment-1158

ध्यान दें कि इन दोनों उदाहरण समाधानों का मानना ​​है कि socket.io और एक्सप्रेस को उसी सत्र स्टोर का उपयोग करने के लिए कॉन्फ़िगर किया गया है और इसलिए उसी सत्र ऑब्जेक्ट का संदर्भ लें।इसे प्राप्त करने के बारे में अधिक विवरण के लिए ऊपर और नीचे दिए गए लिंक देखें:

https://github.com/LearnBoost/socket.io/wiki/Authorizing

+0

बस कहना चाहते हैं कि कमरे के रूप में सत्र आईडी का उपयोग करना एक अच्छा सुझाव था। मुझे एक समस्या हल करने में मदद मिली, इसलिए धन्यवाद :) –

+2

लगता है जैसे socket.io 1.0 प्रति सॉकेट दृष्टिकोण के लिए कमरे में समर्थन में बनाया गया है: http://socket.io/docs/rooms-and-namespaces/ –

+0

कमरा क्लस्टरिंग का ख्याल रखना चाहिए। स्थानीय मेमोरी में अन्य उत्तरों की तरह सॉकेट सहेजने से स्मृति रिसाव हो सकता है और स्केल नहीं हो सकता है। – tsuz

5

socket.io 1.0 में, यह है कि यह कैसे काम करेगा है। यह निम्न संस्करणों के लिए काम कर सकता है, लेकिन मैं इसकी गारंटी नहीं दे सकता।

socket.to(socket_id_here).emit('new', 'hello'); 

यह काम करता है क्योंकि socket.io स्वचालित रूप से सॉकेट की आईडी के साथ एक कमरे में सॉकेट जोड़ता है।

इसके अलावा, यदि आप संस्करण 1.0 में अपग्रेड करने की योजना बना रहे हैं, तो एपीआई में बहुत सारे बदलाव हैं, इसलिए आपको कभी-कभी 1.0 में काम करने के लिए कुछ कोड बदलना होगा।

0

मुझे विश्वास है कि io.sockets.socket को हटा दिया गया है और सॉकेट.आईओ (https://github.com/socketio/socket.io/issues/1618) में एक समस्या हुई है।

आप io.sockets.connected उपयोग कर सकते हैं [socket.id] और socket.id उपयोगकर्ता नाम के माध्यम से उपयोगकर्ता के साथ संदर्भित करने के लिए की दुकान:

var usernames = {}; 
usernames[username] = socket.id; 
// Sending the message 
io.sockets.connected[usernames[username]].emit(...); 

मैं इसे कहीं भी प्रलेखन पर नहीं दिख रहा है तो मैं देख सकते हैं कि इसका उत्तर कैसे दिया गया है। इसके अलावा, अगर आप उपयोगकर्ता नाम माध्यम से किसी भी संदर्भ नहीं है, आप के बजाय कोशिश कर सकते हैं:

users[socket.id] = socket.id; 

आसान पहुँच के लिए कुंजी और मान नकल करने।

नीचे वर्णित io.clients का उपयोग करके संभवतः एक और तरीका भी है, लेकिन मैंने उस विधि का उपयोग नहीं किया है।

अन्य समाधान: Send message to specific client with socket.io and node.js

4

Socket.io 1.0+ में ऐसा करने का सही तरीका क्या है:

io.to(users_socket_id).emit('new', 'hello'); 

तुम भी 'users_socket_id' एक विशिष्ट सॉकेट से फेंकना के लिए एक कमरे नाम स्थानापन्न कर सकते हैं आईओ कमरा

0

क्या आपने इसका उपयोग करने का प्रयास किया है?

var socket = io.connect('http://localhost:80/'); 
+0

यह उत्तर पहले ही शेखर द्वारा कुछ जवाब दिया गया है –

0

मैं नोड के नवीनतम संस्करण के साथ थक गया है और socket.io नीचे मैं पूरा कोड पोस्ट करने के लिए

<ul id="messages"></ul> 
<form action=""> 
    <input id="id1" /><button>Send</button> 
</form> 
<script src="https://cdn.socket.io/socket.io-1.2.0.js"></script> 
<script src="http://code.jquery.com/jquery-1.11.1.js"></script> 
<script> 

    var io = io.connect(); 
    $('form').submit(function(){ 
    io.emit('drumevent', $('#id1').val()); 
    $('#id1').val(''); 
    return false; 
    }); 
    io.on('drumevent', function(msg){ 
    console.log(msg); 



    $('#messages').append($('<li></li>').text(msg.message+' quantity = '+msg.quantity)); 
    }); 
</script> 

सर्वर साइड कोड

जा रहा हूँ
var usernames = {};io.on('connection', function(socket){usernames["username"] = socket.id; 
socket.on('drumevent', function(msg){  
var socketId = socket.id;io.to(socketId).emit('drumevent', data); 
संबंधित मुद्दे