2011-12-11 25 views
8

मैं केवल उपयोगकर्ताओं को संदेशों को उत्सर्जित कर सकता हूं जब उनकी सॉकेट आईडी सीधे io.sockets.on ('कनेक्ट') फ़ंक्शन में संग्रहीत की जाती है। मैं क्यों यह जब उनके सॉकेट आईडी स्टोर करने के लिए के बाद वे प्रवेश कर लिया है की कोशिश कर काम नहीं करता है पता नहींअपने सॉकेट के माध्यम से किसी क्लाइंट को संदेश भेजना

कार्य:।

काम नहीं:

var clients = {}; 
    /** A new socket connection has been accepted */ 
    io.sockets.on('connection', function (socket) 
    { 
    //Used to access session id 
    var hs = socket.handshake;    
     clients[socket.id] = socket; // add the client data to the hash    

    socket.on('user-login', function(user){   
     if(!users['brownj2']){ 
     users['brownj2'] = socket.id; // connected user with its socket.id 
     } 
    }) 

    socket.on('page-load', function(pid) 
    { 
     if(users['brownj2']) 
     {   
     clients[users['brownj2']].emit('hello'); 
     } 
     else 
     { 
     console.log("NOT FOUND BROWNJ2"); 
     } 
    } 
    } 

जावास्क्रिप्ट क्लाइंट-साइड कोड स्निपेट

var socket = io.connect(''); 
socket.on("hello", function(){ 
    alert("Hi Jack"); 
    console.log("WEBSOCKET RECIEVED"); 
}) 

समाधान: धन्यवाद @alessioalex मैं संदर्भ लॉगिन पृष्ठ के socket.io को दूर करने के लिए, और io.sockets.on में निम्नलिखित जोड़ें ('कनेक्शन')

var hs = socket.handshake; 

sessionStore.get(hs.sessionID, function(err, session){ 
    console.log("SESSION: " + util.inspect(session)); 

    clients[socket.id] = socket; // add the client data to the hash 
    validUsers[session.username] = socket.id; // connected user with its socket.id 
}) 

उत्तर

25

पड़ा है आपके कोड के साथ कुछ समस्याएं हैं, सबसे पहले आपको सॉकेट.आईओ के माध्यम से उपयोगकर्ताओं को प्रमाणित नहीं करना चाहिए, आपको यह सुनिश्चित करना चाहिए कि वे प्रमाणीकृत होने के बाद ही कनेक्ट हो सकें। http://www.danielbaulig.de/socket-ioexpress/

इसके अलावा, आप तो जैसे संदेश भेजने से परहेज किया जाना चाहिए, क्योंकि ऐसा करना Socket.IO का हिस्सा आंतरिक रूप से है और बदल सकती: आप एक्सप्रेस का उपयोग कर रहे हैं, तो निम्न आलेख आप एक बहुत मदद कर सकते हैं

io.sockets.socket(id).emit('hello'); 

इसके बजाय यह जुड़ा ग्राहकों के साथ उदाहरण के लिए एक वस्तु रखने के लिए बेहतर है (और ग्राहक एक बार कट निकालने के लिए) (यदि आप एक विशिष्ट ग्राहक के लिए एक संदेश भेजना चाहते हैं):

// the clients hash stores the sockets 
// the users hash stores the username of the connected user and its socket.id 
io.sockets.on('connection', function (socket) { 
    // get the handshake and the session object 
    var hs = socket.handshake; 
    users[hs.session.username] = socket.id; // connected user with its socket.id 
    clients[socket.id] = socket; // add the client data to the hash 
    ... 
    socket.on('disconnect', function() { 
    delete clients[socket.id]; // remove the client from the array 
    delete users[hs.session.username]; // remove connected user & socket.id 
    }); 
} 

// we want at some point to send a message to user 'alex' 
if (users['alex']) { 
    // we get the socket.id for the user alex 
    // and with that we can sent him a message using his socket (stored in clients) 
    clients[users['alex']].emit("Hello Alex, how've you been"); 
} 

ज़रूर, io.sockets.socket(id) काम कर सकते हैं (didn ' टी वास्तव में परीक्षण), लेकिन यह हमेशा भी बदला जा सकता है क्योंकि यह सॉकेट.आईओ आंतरिक का हिस्सा है, इसलिए मेरा समाधान ऊपर 'सुरक्षित' है।

एक और बात आप क्लाइंट की तरफ अपने कोड में परिवर्तित करने के लिए चाहते हो सकता है var socket = io.connect('http://localhost'); साथ var socket = io.connect(''); है, जैसा कि हम यहाँ Socket.IO की आधिकारिक उदाहरण में देख सकते हैं: http://socket.io/#how-to-use

+0

धन्यवाद, यह फिर भी काम करता है जब मैं socket.on इस्तेमाल करने की कोशिश ('लॉग इन', .....) {उपयोगकर्ताओं [यू] = socket.id} यह काम नहीं करता। मैं केवल उपयोगकर्ताओं को io.sockets.on ('कनेक्शन') के अंदर सीधे जोड़ सकता हूं – Jack

+1

क्या आप निश्चित हैं? चूंकि सॉकेट एक चर परिभाषित 'उपरोक्त' है, यह उस फ़ंक्शन में भी दिखाना चाहिए, जैसे कि मैं डिस्कनेक्ट के साथ अपने उदाहरण में दिखाता हूं। – alessioalex

+1

मैंने आपको एक कामकाजी और गैर-कामकाजी उदाहरण दिखाने के लिए प्रश्न को संशोधित किया है। मैं यह नहीं समझ सकता कि यह मुझे उपरोक्त 'गैर-कामकाजी' उदाहरण में संदेश भेजने की अनुमति क्यों नहीं देगा। – Jack

2

मैं देख सकता हूँ कि इस पोस्ट पैदा कर रहा है

नोट्स

मैं सत्र भंडारण के रूप में इस्तेमाल किया है Redis: काफी रुचि का एक बहुत ... तो मैं कोड मैं इस लागू करने के लिए प्रयोग किया जाता है पोस्ट करने के लिए जा रहा हूँ। सत्र प्रारंभिक रूप से लॉग इन पेज के दौरान उपयोगकर्ता अनुरोध वाले HTTP अनुरोध के माध्यम से सेटअप किया जाता है, यदि ये विवरण मान्य हैं (एक मोंगोडीबी दस्तावेज के खिलाफ जांच की गई है) ... तो सत्र बनाया गया है।

सर्वर साइड कोड निर्माण और सत्र/सॉकेट को हटाया

//Auth the user 
io.set('authorization', function (data, accept) { 
    // check if there's a cookie header 
    if (data.headers.cookie) { 
    data.cookie = parseCookie(data.headers.cookie); 
    data.sessionID = data.cookie['express.sid']; 

    //Save the session store to the data object 
    data.sessionStore = sessionStore; 

    sessionStore.get(data.sessionID, function(err, session){ 
     if(err) throw err; 

     if(!session) 
     { 
     console.error("Error whilst authorizing websocket handshake"); 
     accept('Error', false); 
     } 
     else 
     { 
     console.log("AUTH USERNAME: " + session.username); 
     if(session.username){ 
      data.session = new Session(data, session); 
      accept(null, true); 
     }else { 
      accept('Invalid User', false); 
     } 
     } 
    }) 
    } else { 
    console.error("No cookie was found whilst authorizing websocket handshake"); 
    return accept('No cookie transmitted.', false); 
    } 
}); 

/** A new socket connection has been accepted */ 
io.sockets.on('connection', function (socket) 
{  
    var hs = socket.handshake; 
    if(hs.session) 
    { 
    if(hs.session.username) 
    { 
     clients[socket.id] = socket; // add the client data to the hash 
     validUsers[hs.session.username] = socket.id; // connected user with its socket.id 
    } 
    } 


    socket.on('disconnect', function() 
    { 
    delete browsing[hs.session.username]; //Remove the client from the browsing hash 
    delete clients[socket.id];   // remove the client from the array 
    delete validUsers[hs.session.username]; // remove connected user & socket.id 
    }) 
.... 
} 

सर्वर साइड चयनात्मक संदेश

इस कोड को भेजा जा रहा है मुझे एक परियोजना के सदस्यों टीम के लिए एक संदेश भेजने के लिए अनुमति देता है। उपयोगकर्ताओं की एक टीम उपयोगकर्ताओं की एक अलग टीम से संदेश प्राप्त नहीं करेगी ..

for(var i = 0; i < project.team.length; i++) 
{ 
    if(validUsers[project.team[i].username]) 
    { 
    if(clients[validUsers[project.team[i].username]]) 
    { 
     projects.update({"_id" : projectId}, 
     {"$pull" : 
      {"stories" : {"_id" : storyId}} 
     } 
    );     
     clients[validUsers[project.team[i].username]].emit('delete-story', storyId); 
    } 
    else 
    { 
     console.error("Project team member not found"); 
    } 
    } 
} 
संबंधित मुद्दे