दिलचस्प पोस्ट
इकाई फ़्रेमवर्क वन टू वन मैपिंग इश्युज़ आधार64 में ब्लॉब कन्वर्ट करें घोंसले के शिकार एनजी-कोयले जेएस में विचार साधारण सीरियल पॉइंट-टू-पॉइंट कम्यूनिकेशन प्रोटोकॉल पीछे वाले शून्य निकालें किसी दिए गए प्रक्रिया के लिए चलाने के समय साझा किए गए पुस्तकालयों को कैसे लोड किया जा सकता है? एंड्रॉइड: गिनती टाइमर पिछले पर टिक निकलती है ()! निर्माता प्रतीकों का दोहरी उत्सर्जन PHP: खतरनाक कार्यों को अक्षम करने के लिए कैसे करें "सज्जाकार" क्या हैं और उनका उपयोग कैसे किया जाता है? मनमाने मनमानी के कार्य के साथ `नॉट` कैसे लिखाना है? मैं ब्राउज़र की चौड़ाई के आधार पर कैसे सीएसएस स्टाइलशीट को गतिशील रूप से समायोजित कर सकता हूं? बाइट्स की एक स्ट्रिंग को एक int (अजगर) में परिवर्तित करें रिलेशनल डेटाबेस में प्रमुख मूल्य जोड़े डेल्फी के लिए प्रोफाइलर और मेमोरी विश्लेषण टूल

विशिष्ट क्लाइंट को socket.io और node.js के साथ संदेश भेजें

मैं socket.io और node.js के साथ काम कर रहा हूं और अब तक यह बहुत अच्छा लगता है, लेकिन मुझे नहीं पता कि सर्वर से एक विशिष्ट क्लाइंट को संदेश कैसे भेजा जाए, ऐसा कुछ:

client.send(message, receiverSessionId) 

लेकिन न तो। .send() और न ही। .broadcast() तरीके मेरी .broadcast() आपूर्ति करते हैं।

मुझे एक संभावित समाधान के रूप में क्या मिला है, यह है कि .broadcast() पद्धति दूसरे पैरामीटर के रूप में स्वीकार करती है जो .broadcast() एक सरणी को स्वीकार करता है जिसके लिए संदेश नहीं भेजा जाता है, इसलिए मैं सर्वर पर उस पल से जुड़े सभी सत्र आयडी के साथ एक सरणी को पास कर सकता था , जिसे मैं संदेश भेजना चाहता हूं, को छोड़कर, लेकिन मुझे लगता है कि बेहतर समाधान होना चाहिए।

कोई विचार?

वेब के समाधान से एकत्रित समाधान "विशिष्ट क्लाइंट को socket.io और node.js के साथ संदेश भेजें"

अच्छी तरह से आपको उस क्लाइंट को आश्चर्यचकित करना होगा, आप या तो सरल तरीके से जा सकते हैं:

 var io = io.listen(server); io.clients[sessionID].send() 

जो टूट सकता है, मुझे इसमें संदेह नहीं है, लेकिन यह हमेशा एक संभावना है कि io.clients बदल सकते हैं, इसलिए उपरोक्त सावधानी के साथ उपयोग करें

या फिर आप खुद को ग्राहकों का ट्रैक रख सकते हैं, इसलिए आप उन्हें अपने स्वयं के clients को connection श्रोता में जोड़ें और disconnect श्रोता में उन्हें हटा दें।

मैं बाद वाले का इस्तेमाल करता हूं, क्योंकि आपके आवेदन के आधार पर आप क्लाइंट के लिए वैसे भी अधिक राज्य चाहते हैं, इसलिए clients[id] = {conn: clientConnect, data: {...}} हो सकता है काम।

Ivo Wetzel का उत्तर Socket.io 0.9 में वैध नहीं लगता है।

संक्षेप में आपको अब socket.id सहेजना होगा और io.sockets.socket(savedSocketId).emit(...) उपयोग करना होगा। io.sockets.socket(savedSocketId).emit(...) इसे संदेश भेजने के लिए।

इस तरह मैं क्लस्टर नोड। जेएस सर्वर में काम कर रहा हूं:

सबसे पहले आपको स्टोर के रूप में Redis स्टोर सेट करने की आवश्यकता है ताकि संदेश क्रॉस प्रोसेस को जा सकें:

 var express = require("express"); var redis = require("redis"); var sio = require("socket.io"); var client = redis.createClient() var app = express.createServer(); var io = sio.listen(app); io.set("store", new sio.RedisStore); // In this example we have one master client socket // that receives messages from others. io.sockets.on('connection', function(socket) { // Promote this socket as master socket.on("I'm the master", function() { // Save the socket id to Redis so that all processes can access it. client.set("mastersocket", socket.id, function(err) { if (err) throw err; console.log("Master socket is now" + socket.id); }); }); socket.on("message to master", function(msg) { // Fetch the socket id from Redis client.get("mastersocket", function(err, socketId) { if (err) throw err; io.sockets.socket(socketId).emit(msg); }); }); }); 

मैं क्लस्टरिंग कोड को यहां छोड़ दिया, क्योंकि यह इसे अधिक बरबाद करता है, लेकिन यह जोड़ने के लिए तुच्छ है बस कार्यकर्ता कोड में सब कुछ जोड़ें यहां अधिक डॉक्स http://nodejs.org/api/cluster.html

प्रत्येक सॉकेट एक नाम के लिए एक सॉकेट आईडी के साथ एक कमरे में जुड़ जाता है, इसलिए आप बस कर सकते हैं

 io.to(socket#id).emit('hey') 

डॉक्स: http://socket.io/docs/rooms-and-namespaces/#default-room

चियर्स

सबसे आसान, सबसे खूबसूरत समाधान

यह उतना आसान है जैसे:

 client.emit("your message"); 

और बस।

पर कैसे? मुझे एक उदाहरण दे

हम सभी की जरूरत क्या है वास्तव में एक पूर्ण उदाहरण है, और यही है जो निम्नानुसार है। यह सबसे हाल की सॉकेट.ओ संस्करण (2.0.3) के साथ परीक्षण किया गया है और यह आधुनिक जावास्क्रिप्ट का उपयोग भी कर रहा है (जो हमें अब सभी का उपयोग करना चाहिए)।

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

सर्वर

server.js

 const io = require("socket.io"), server = io.listen(8000); let sequenceNumberByClient = new Map(); // event fired every time a new client connects: server.on("connection", (socket) => { console.info(`Client connected [id=${socket.id}]`); // initialize this client's sequence number sequenceNumberByClient.set(socket, 1); // when socket disconnects, remove it from the list: socket.on("disconnect", () => { sequenceNumberByClient.delete(socket); console.info(`Client gone [id=${socket.id}]`); }); }); // sends each client its current sequence number setInterval(() => { for (const [client, sequenceNumber] of sequenceNumberByClient.entries()) { client.emit("seq-num", sequenceNumber); sequenceNumberByClient.set(client, sequenceNumber + 1); } }, 1000); 

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

हर दूसरे, एक टाइमर निकाल दिया जाता है। जब ऐसा होता है, तो सर्वर मैप के माध्यम से चलता है और हर ग्राहक को अपने वर्तमान अनुक्रम संख्या के साथ एक संदेश भेजता है। यह फिर इसे बढ़ाता है और नक्शे में नंबर वापस संग्रहीत करता है। यही वह सब है जो इसके लिए है बहुत आसान।

ग्राहक

ग्राहक का हिस्सा भी सरल है यह केवल सर्वर से जुड़ता है और seq-num संदेश के लिए सुनता है, हर समय आने पर कंसोल को प्रिंट करता है।

client.js

 const io = require("socket.io-client"), ioClient = io.connect("http://localhost:8000"); ioClient.on("seq-num", (msg) => console.info(msg)); 

उदाहरण चल रहा है

आवश्यक पुस्तकालयों को स्थापित करें:

 npm install socket.io npm install socket.io-client 

सर्वर चलाएं:

 node server 

अन्य टर्मिनल खिड़कियां खोलें और चलने के द्वारा जितने चाहें उतने ग्राहकों को अंडे दें:

 node client 

मैंने यहां पूर्ण कोड के साथ एक सार भी तैयार किया है ।

1.0 में आप का उपयोग करना चाहिए:

io.sockets.connected [socketid] .emit ();

आप उपयोग कर सकते हैं

// केवल प्रेषक-ग्राहक को संदेश भेजें

socket.emit('message', 'check this');

// या आप प्रेषक सहित सभी श्रोताओं को भेज सकते हैं

io.emit('message', 'check this');

// प्रेषक को छोड़कर सभी श्रोताओं को भेजें

socket.broadcast.emit('message', 'this is a message');

// या आप इसे एक कमरे में भेज सकते हैं

socket.broadcast.to('chatroom').emit('message', 'this is the message to all');

हम जो भी संस्करण का उपयोग कर रहे हैं, यदि हम सिर्फ console.log () "आइओ" ऑब्जेक्ट को अपने सर्वर साइड नोडज कोड में उपयोग करते हैं, जैसे [io.on ('कनेक्शन', फ़ंक्शन (सॉकेट) {…});] , हम देख सकते हैं कि "io" सिर्फ एक जेसन ऑब्जेक्ट है और कई बच्चे ऑब्जेक्ट हैं जहां सॉकेट आईडी और सॉकेट ऑब्जेक्ट्स संग्रहीत हैं।

मैं socket.io संस्करण 1.3.5, btw का उपयोग कर रहा हूँ।

अगर हम ओओ ऑब्जेक्ट में देखते हैं, इसमें शामिल है,

  sockets: { name: '/', server: [Circular], sockets: [ [Object], [Object] ], connected: { B5AC9w0sYmOGWe4fAAAA: [Object], 'hWzf97fmU-TIwwzWAAAB': [Object] }, 

यहाँ हम सॉकेट्स "B5AC9w0sYmOGWe4fAAAA" आदि देख सकते हैं। तो, हम कर सकते हैं,

 io.sockets.connected[socketid].emit(); 

फिर, आगे के निरीक्षण पर हम खंडों को देख सकते हैं जैसे,

  eio: { clients: { B5AC9w0sYmOGWe4fAAAA: [Object], 'hWzf97fmU-TIwwzWAAAB': [Object] }, 

इसलिए, हम यहां से एक सॉकेट प्राप्त कर सकते हैं

 io.eio.clients[socketid].emit(); 

इसके अलावा, हमारे पास इंजन के तहत,

 engine: { clients: { B5AC9w0sYmOGWe4fAAAA: [Object], 'hWzf97fmU-TIwwzWAAAB': [Object] }, 

तो, हम यह भी लिख सकते हैं,

 io.engine.clients[socketid].emit(); 

तो, मुझे लगता है हम ऊपर सूचीबद्ध किसी भी 3 तरीकों में हमारा लक्ष्य प्राप्त कर सकते हैं,

  1. io.sockets.connected [socketid] .emit (); या
  2. io.eio.clients [socketid] .emit (); या
  3. io.engine.clients [socketid] .emit ();

तुम यह केर सकते हो

सर्वर पर

 global.io=require("socket.io")(server); io.on("connection",function(client){ console.log("client is ",client.id); //This is handle by current connected client client.emit('messages',{hello:'world'}) //This is handle by every client io.sockets.emit("data",{data:"This is handle by every client"}) app1.saveSession(client.id) client.on("disconnect",function(){ app1.deleteSession(client.id) console.log("client disconnected",client.id); }) }) //And this is handle by particular client var socketId=req.query.id if(io.sockets.connected[socketId]!=null) { io.sockets.connected[socketId].emit('particular User', {data: "Event response by particular user "}); } 

और ग्राहक पर, इसे संभाल करना बहुत आसान है।

 var socket=io.connect("http://localhost:8080/") socket.on("messages",function(data){ console.log("message is ",data); //alert(data) }) socket.on("data",function(data){ console.log("data is ",data); //alert(data) }) socket.on("particular User",function(data){ console.log("data from server ",data); //alert(data) }) 

संस्करण 1.4.5 के अनुसार, सुनिश्चित करें कि आप io.to () में एक ठीक से प्रीफ़िक्स सॉकेट आईडी प्रदान करते हैं। मैं गर्तिका ले रहा था ग्राहक डीबग करने के लिए लॉग इन और यह उपसर्ग के बिना था, इसलिए मैं हमेशा के लिए खोज तक समाप्त हो गया जब तक मुझे पता चला! तो आपको इसे ऐसा करना पड़ सकता है यदि आपके पास आईडी पहले से नहीं है:

 io.to('/#' + socketId).emit('myevent', {foo: 'bar'}); 

io.sockets.sockets [socket.id] .emit (…) v0.9 में मेरे लिए काम किया

सॉकेट.आईओ आपको अपने सॉकेट्स को "नेमस्पेस" करने की अनुमति देता है, जिसका मतलब है कि विभिन्न एंडपॉइंट या पथ असाइन करना है।

इससे मदद मिल सकती है: http://socket.io/docs/rooms-and-namespaces/