मैं अपने उपयोगकर्ता नाम को एक सरणी में जोड़कर अपने चैट रूम में सभी कनेक्टेड क्लाइंट के उपयोगकर्ता नाम प्रदर्शित करने का प्रयास कर रहा हूं। वर्तमान में, मेरा कोड उपयोगकर्ता-सूची को सबसे हाल के उपयोगकर्ता नाम के साथ अपडेट करेगा, जो कि सरणी में उपयोगकर्ता नाम जोड़ने के बजाय शामिल हो गया है, जिससे मुझे विश्वास हो जाता है कि सरणी वास्तव में मेरे अनुमान के अनुसार उत्सर्जित नहीं हो रही है?

स्क्रिप्ट.जेएस:

var items = [];
var user = user;
if (!user) {
  user = prompt('Please choose a username:');
  items.push(user);
  socket.emit('theitems', {
      items: items
});
  if (!user) {
    alert('Your name has been set to "Anonymous"');
    user = "Anonymous"
        items.push(user);
  } else {
      alert('Your name has been set to "'+ user +'"');
  } 
}
console.log(items);

socket.on('theitems', function (data) {
      $('.dispUser').html(data.items);
    });

Index.js

server(socket('theitems', ctx => { console.log(ctx.data); ctx.io.emit('theitems', ctx.data); }));

अद्यतन कोड जो सर्वर को 'मास्टर सरणी' के रूप में उपयोग करता है।

इस कोड (+ उपरोक्त में से कुछ) ने मेरी समस्या हल कर दी है।

Index.js (सर्वर):

var newitems = [];
server(socket('theitems', ctx => { newitems.push(ctx.data); console.log(ctx.data); ctx.io.emit('theitems', newitems); }));

Script.js (क्लाइंट):

socket.emit('theitems', user);

socket.on('theitems', function (data) {
      $('.dispUser').html(data);
      console.log(data);
    });
0
xstax 5 मई 2020, 21:59
माफ़ करना; मेरा विचार यह है कि एक सरणी (आइटम []) है जो ग्राहकों के उपयोगकर्ता नामों को शामिल करती है और छोड़ती है, और उस सरणी को
पर प्रदर्शित करती है, इसलिए, जैसे ही ग्राहक जुड़ते हैं और छोड़ते हैं, उनके उपयोगकर्ता नाम प्रदर्शित/हटा दिए जाते हैं , उर्फ, एक "ऑनलाइन उपयोगकर्ता" अनुभाग।
 – 
xstax
6 मई 2020, 04:52

2 जवाब

सबसे बढ़िया उत्तर

माफ़ करना; मेरा विचार यह है कि एक सरणी (आइटम []) है जो क्लाइंट के उपयोगकर्ता नामों को शामिल होने और छोड़ने के रूप में संग्रहीत करती है, और उस सरणी को a पर प्रदर्शित करती है, इसलिए, जैसे क्लाइंट शामिल होते हैं और छोड़ते हैं, उनके उपयोगकर्ता नाम प्रदर्शित/हटा दिए जाते हैं, उर्फ, एक "ऑनलाइन उपयोगकर्ता" अनुभाग।

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

पूरे सरणी को एक विशिष्ट सॉकेट में भेजने के लिए, आप ऐसा कुछ करेंगे:

socket.emit('userList', userArray);

इसे सभी जुड़े हुए उपयोगों में भेजने के लिए, आप यह करेंगे:

io.emit('userList', userArray);

दोनों ही मामलों में, क्लाइंट 'userList' संदेश को सुनेगा और फिर उसके अनुसार अपने डिस्प्ले को अपडेट करेगा।

socket.on('userList', userArray => {
    // refresh  the display to show the userArray
});
0
jfriend00 6 मई 2020, 04:58
यह काफी कुछ है जो मैंने पहले ही किया है; मैं सर्वर पर सरणी आइटम [] उत्सर्जित कर रहा हूं, जो इसे ग्राहकों को भेज रहा है। क्लाइंट-साइड तब इसे प्राप्त करता है और इसे प्रदर्शित करता है। हालाँकि, यह वर्तमान में सरणी में उपयोगकर्ता नाम नहीं जोड़ता है ([जेम्स] -> [जेम्स, बॉब] -> [जेम्स, बॉब, पॉल]), लेकिन परिणामी कनेक्टिंग उपयोगकर्ता आदि से जुड़ने वाले पहले उपयोगकर्ता के नाम को बदल देता है। ([जेम्स] -> [बॉब] -> [पॉल])।
 – 
xstax
7 मई 2020, 01:58
- फिर हमें सटीक और वास्तविक कोड दिखाएं जहां आपको लगता है कि आप ऐसा कर रहे हैं। आप जो कोड दिखाते हैं वह एक खाली items सरणी से शुरू होता है, इसमें एक आइटम जोड़ता है और सर्वर को भेजता है। और, जब आप सर्वर से आइटम प्राप्त करते हैं, तो ऐसा लगता है कि आप डिस्प्ले को अपडेट कर सकते हैं, लेकिन आप items की स्थानीय कॉपी को अपडेट नहीं करते हैं, इसलिए अगली बार जब आप इसे संशोधित करते हैं, तो आप एक खाली items, इसमें एक जोड़ें और फिर उसे वापस सर्वर पर भेजें।
 – 
jfriend00
7 मई 2020, 02:47
- यह पूरा मॉडल त्रुटिपूर्ण लगता है। सर्वर को मदों की मास्टर सूची रखनी चाहिए। क्लाइंट को तब उस सूची से अलग-अलग आइटम जोड़ने या हटाने के लिए कहना चाहिए और सर्वर मास्टर सूची को संशोधित करने के बाद सभी क्लाइंट को मास्टर सूची को फिर से भेज सकता है।
 – 
jfriend00
7 मई 2020, 02:47
मैंने फिर से मास्टर सूची की कोशिश की, और मैं इसे काम करने में कामयाब रहा। कुछ मुद्दों को महसूस किया कि मैं इसे कैसे उत्सर्जित कर रहा था, लेकिन इसे हल करने में कामयाब रहा। आपकी दृढ़ सहायता के लिए धन्यवाद।
 – 
xstax
7 मई 2020, 03:19

यह आसान है, बस socket.emit('eventName', array);

लेकिन अगर आप सरणी के आइटम बदलते हैं, तो यह सभी सॉकेट क्लाइंट और/या सर्वर में नहीं बदलेगा। हर बार जब सरणी बदल जाती है तो आपको नई सरणी उत्सर्जित करने की आवश्यकता होती है। अन्यथा सॉकेट उनके मूल्यों को अपडेट नहीं करने वाले हैं

0
Damian Plewa 6 मई 2020, 00:21