সকেট.ইও সহ কোনও নির্দিষ্ট ক্লায়েন্টকে কীভাবে একটি বার্তা প্রেরণ করা যায়


97

আমি সকেট.ইও + নোড.জেএস দিয়ে শুরু করছি, আমি কীভাবে স্থানীয়ভাবে একটি বার্তা প্রেরণ করতে এবং socket.broadcast.emit()ফাংশন সম্প্রচার করতে জানি : - সংযুক্ত সমস্ত ক্লায়েন্ট একই বার্তা গ্রহণ করে।

এখন, আমি কীভাবে কোনও নির্দিষ্ট ক্লায়েন্টকে একটি ব্যক্তিগত বার্তা প্রেরণ করব তা জানতে চাই, আমি 2 ব্যক্তির (ক্লায়েন্ট-টু-ক্লায়েন্ট স্ট্রিম) মধ্যে একটি ব্যক্তিগত চ্যাটের জন্য একটি সকেট বোঝাতে চাই। ধন্যবাদ


দুঃখিত psiphi75 তবে এই লিঙ্কটি আমার উত্তরের উত্তর দেয় না, এটি কোনও সদৃশ প্রশ্ন নয়।
নিজার বি।

4
@ পিপিপি 75, এটি কোনওভাবেই সদৃশ নয়
সফটওয়ার

4
@Psiphi এর মতো লোককে দাঁড়াতে পারে না। আপনি এমনকি একটি বিকাশকারী? এইচটিএমএল 5 সুনির্দিষ্ট প্রশ্নটি কীভাবে একটি স্বতন্ত্র গ্রন্থাগারের সাথে সম্পর্কিত? এবং এটির জন্য মূল্যবান, ওয়েবসকেটগুলি সকেট.ইও নয়। সকেট.ইও হ'ল একটি লাইব্রেরি যা ওয়েবসকেটগুলি ব্যবহার করতে পারে তবে আমি খনন করি। এটি কেবল প্রযুক্তি সম্পর্কে নয়, কেবল নির্দিষ্ট ক্লায়েন্টদের ডেটা প্রেরণ সম্পর্কে গ্রন্থাগারের সাথে সম্পর্কিত আরও সুনির্দিষ্ট প্রশ্ন।
লেবি রবার্টস


@ বাগুইয়েলস94 আসলে নয়, এই পোস্টটি ২০১১ সালের এবং নোডেজের কোড-ভিত্তিতে প্রচুর পরিমাণে পরিবর্তন ছিল। এই পোস্টটি অবশ্যই এই সমস্যাটির জন্য একটি বৈধ প্রশ্ন / উত্তর।
নিজার বি।

উত্তর:


102

যখন কোনও ব্যবহারকারী সংযুক্ত থাকে, তখন এটির একটি ব্যবহারকারীর নাম সহ সার্ভারে একটি বার্তা প্রেরণ করা উচিত যা ইমেলের মতো অনন্য হতে হবে।

একজোড়া ব্যবহারকারীর নাম এবং সকেট এই জাতীয় কোনও বস্তুতে সংরক্ষণ করা উচিত:

var users = {
    'userA@example.com': [socket object],
    'userB@example.com': [socket object],
    'userC@example.com': [socket object]
}

ক্লায়েন্টে, নিম্নলিখিত ডেটা সহ সার্ভারে একটি বস্তু প্রেরণ করুন:

{
    to:[the other receiver's username as a string],
    from:[the person who sent the message as string],
    message:[the message to be sent as string]
}

সার্ভারে, বার্তা শুনতে। যখন কোনও বার্তা আসে, তখন রিসিভারে ডেটা প্রেরণ করুন।

users[data.to].emit('receivedMessage', data)

ক্লায়েন্টে, 'রিসিভড ম্যাসেজ' নামক সার্ভার থেকে প্রেরণের কথা শুনুন এবং ডেটা পড়ে আপনি কে এটি থেকে এসেছে এবং যে বার্তাটি প্রেরিত হয়েছিল তা হ্যান্ডেল করতে পারেন।


28
আপনি যদি এই সমাধানটি ব্যবহার করেন তবে আপনার বুঝতে হবে: 1. ব্যবহারকারী সংযোগ বিচ্ছিন্ন করার পরে আপনাকে 'ব্যবহারকারীদের' বিষয়টিকে পরিষ্কার করতে হবে 2. এটি দ্বিতীয় সংযোগকে সমর্থন করে না - উদাহরণস্বরূপ অন্য ব্রাউজার থেকে। সুতরাং যদি ব্যবহারকারী অন্য ব্রাউজার থেকে সংযোগ স্থাপন করে - পুরানো সংযোগটি ওভাররেড হবে।
ভ্লাদিমির কুড়িভভ

4
কিভাবে আপনি একটি ডাটাস্টোরে সকেট অবজেক্টটি সঞ্চয় করবেন? আমি ধরে নিচ্ছি আপনার যদি একাধিক নোড প্রক্রিয়া থাকে তবে এটি কাজ করে না।
chovy

@ chovy আপনাকে redis ব্যবহার করতে হবে এই github.com/LearnBoost/Sket.IO/wiki/Configuring-Sket.IO- এ দেখুন
ভ্লাদিমির কুরিজভ

11
আমি এই সমাধানটি ব্যবহার না করার পরামর্শ দেব। আমি এই পদ্ধতির সীমাবদ্ধতা অতিক্রম করার চেষ্টা করে অনেক সময় নষ্ট করেছিলাম। দেখুন @ az7ar এর সমাধান এবং এই কেন এটা ভালো জন্য ব্যাখ্যা
ড্যানিয়েল কুই

@DanielQue +1। ব্যবহৃত দেশীয় কার্যকারিতা আরও ভাল Way ধন্যবাদ!
অ্যারন লেলেভিয়ার

281

আপনি সকেট.আইও রুম ব্যবহার করতে পারেন। ক্লায়েন্ট পক্ষ থেকে কোনও ইভেন্ট নির্গত (এই ক্ষেত্রে "যোগদান", যে কোনও কিছু হতে পারে) কোনও অনন্য সনাক্তকারী (ইমেল, আইডি) সহ।

মক্কেলের পক্ষে:

var socket = io.connect('http://localhost');
socket.emit('join', {email: user1@example.com});

এখন, সার্ভার দিক থেকে সেই তথ্যটি ব্যবহারকারীর জন্য একটি অনন্য ঘর তৈরি করতে ব্যবহার করুন

সার্ভার সাইড:

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  socket.on('join', function (data) {
    socket.join(data.email); // We are using room of socket io
  });
});

সুতরাং, এখন প্রতিটি ব্যবহারকারী ব্যবহারকারীর ইমেলের নামে নামের একটি ঘরে যোগ দিয়েছে। সুতরাং আপনি যদি কোনও নির্দিষ্ট ব্যবহারকারীর কাছে একটি বার্তা প্রেরণ করতে চান তবে আপনাকে কেবল এটি করতে হবে

সার্ভার সাইড:

io.sockets.in('user1@example.com').emit('new_msg', {msg: 'hello'});

ক্লায়েন্ট পক্ষের শেষ কাজটি "নতুন_এমএসজি" ইভেন্টটি শোনানো।

মক্কেলের পক্ষে:

socket.on("new_msg", function(data) {
    alert(data.msg);
}

আমি আপনি ধারণা পেতে আশা করি।


4
দয়া করে এই লাইনটি io.sket.in ('user1@example.com ') পরিবর্তন করুন e emit (' new_msg ', {msg:' হ্যালো '}); এই io.sockets.in ('user1@example.com ') এর মতো। emit (' new_msg ', {msg:' হ্যালো ';);
সিলভেস্টারপ্রুবু

44
এই উত্তরটি বর্তমানে গৃহীত উত্তরের চেয়ে অনেক ভাল। এখানে কেন: 1) আপনার ক্লায়েন্টগুলির বিশ্বব্যাপী অ্যারে পরিচালনা এবং পরিষ্কার করতে হবে না। ২) একই পৃষ্ঠায় কোনও ব্যবহারকারীর একাধিক ট্যাব খোলা থাকলেও এটি কাজ করে। 3) এটি সহজেই একটি নোড ক্লাস্টার (একাধিক প্রক্রিয়া) এর সাথে কাজ করার জন্য বাড়ানো যেতে পারে socket.io-redis
ড্যানিয়েল কুই

4
আপনি কীভাবে {email: user1@example.com}সমস্ত সংযোগের জন্য আলাদা করতে পারবেন অ্যাপ্লিকেশনটিতে যাওয়া সমস্ত ক্লায়েন্টের ব্যবহারকারী নেই user1@example.comআমি কীভাবে এটির user2@example.comদ্বিতীয় ক্লায়েন্টের সাথে সংযোগ স্থাপনকারী যাতে আমি বিভিন্ন ঘর থাকতে পারি তার জন্য কীভাবে এটি ব্যবহারকারীর তৈরি করব? দুঃখিত যদি এটি একটি বিরক্তিকর প্রশ্ন হয়।
জ্যাক ফাঁকা

4
সমাধানটি পছন্দ করেছিল তবে আমি বিশ্বাস করি যে এখানে নিরাপত্তা আপোস করা হয়েছে। আমি যদি ক্লায়েন্টের পাশের স্ক্রিপ্টে ইমেলটি পরিবর্তন করি। এখন আমি অন্যান্য ব্যক্তিগত বার্তাও পড়তে সক্ষম হয়েছি। তুমি কি বলছ?
গোপীনাথ শিব

4
এটি ইমেল হতে হবে না আমি কোনও অনন্য শনাক্তকারী উল্লেখ করেছি
az7ar

34

সুর: সহজভাবে,

এটি আপনার প্রয়োজন:

io.to(socket.id).emit("event", data);

যখনই কোনও ব্যবহারকারী সার্ভারে যোগ দেয়, আইডি সহ সকেটের বিবরণ উত্পন্ন হয়। এই আইডিটি সত্যই নির্দিষ্ট লোকদের কাছে একটি বার্তা প্রেরণে সহায়তা করে।

প্রথমে আমাদের সমস্ত সকেট.আইডির অ্যারেতে সঞ্চয় করতে হবে,

var people={};

people[name] =  socket.id;

এখানে নাম প্রাপকের নাম। উদাহরণ:

people["ccccc"]=2387423cjhgfwerwer23;

সুতরাং, আমরা যখনই বার্তা প্রেরণ করছি তখন আমরা সেই সকেট.আইডিটি রিসিভার নামের সাথে পেতে পারি:

এর জন্য আমাদের রিসিভারনেমটি জানতে হবে। আপনাকে সার্ভারে রিসিভারের নাম নির্গত করতে হবে।

চূড়ান্ত জিনিস হ'ল:

 socket.on('chat message', function(data){
io.to(people[data.receiver]).emit('chat message', data.msg);
});

আশা করি এটি আপনার পক্ষে ভাল কাজ করে।

শুভকামনা !!


আপনি কি ক্লায়েন্ট সাইড এবং সার্ভার সাইড কোড তৈরি করতে পারেন? আমি স্ককেট প্রোগ্রামিংয়ে নতুন। hmahajan.dmi@gmail.com
হরিশ মহাজন

@ হারিশ, নীচের লিঙ্কটি দেখুন, ক্লায়েন্টের পক্ষ থেকে কী ঘটছে তা ব্যাখ্যা করে..আমি আশা করি এটি আপনাকে আরও সাহায্য করবে .. সকেট.আইও
ট্রোজান

4
তবে যদি ব্যবহারকারী একই সাথে 2 জন অন্যের সাথে চ্যাট করছে। উভয় ব্যবহারকারীর বার্তা উভয় উইন্ডোতে আসবে না?
শরণ মোহনদাস

যদি দু'জনের বেশি ব্যবহারকারী থাকে তবে এটি সঠিকভাবে কাজ করবে না
মোহাম্মাদ হাশাম

প্রতিবার ব্যবহারকারীরা সকেট আইডি পরিবর্তনগুলি সংযুক্ত করে তাই ব্যবহারকারী যদি একাধিক ট্যাবে আপনার অ্যাপ্লিকেশনটি খোলার ক্ষেত্রে এটি আপনার সঞ্চিত এবং অন্যান্য সকেট সংযোগগুলিতে প্রেরণ করা এমন
একটিটির

8

আপনি সকেট.আইও রুমগুলি উল্লেখ করতে পারেন । আপনি যখন সকেটটি হাতেনাতে ব্যবহার করেন - আপনি উদাহরণস্বরূপ "ব্যবহারকারী room

এর পরে, আপনি কোনও ক্লায়েন্টকে সুবিধামত নামে ব্যক্তিগত संदेश পাঠাতে পারেন, উদাহরণস্বরূপ:

io.sockets.in ('user.125')। নির্গত ('new_message', {পাঠ্য: "হ্যালো ওয়ার্ল্ড"})

উপরের ক্রিয়াকলাপে আমরা "125" ব্যবহারকারীর কাছে "নতুন_মেসেজ" প্রেরণ করি।

ধন্যবাদ


হাই সাথী, আপনার প্রথম উত্তরের জন্য আপনাকে ধন্যবাদ, আমি এটি চেষ্টা করব এবং আপনাকে সে সম্পর্কে জানাবো, কারণ আমি চ্যাট তৈরি করতে চাই না তবে আপনার মতো একটি ব্যক্তিগত মেসেঞ্জার ফেসবুক নেটওয়ার্কে ব্যবহার করতে পারি।
নিজার বি।

কেউ কি এই বিষয়ে আমাকে সাহায্য করতে পারে, আমি সত্যিই আটকে আছি, আমি আমার সকেটের সাথে যুক্ত একটি ব্যবহারকারীর নাম যুক্ত করতে চাই এবং আমার অ্যাপ্লিকেশনটি কোনও নির্দিষ্ট ব্যবহারকারীর কাছে কোনও বার্তা প্রেরণের অনুমতি দিতে পারি, কোনও চ্যাট রুম নয়, এটি মেসেঞ্জারের মতো একটি ফেসবুক। ধন্যবাদ জানলে!
নিজার বি

প্রথমে আপনাকে বুঝতে হবে যে এই ব্যবহারকারীর নামটি সমস্ত ব্যবহারকারীর মধ্যে অনন্য হতে হবে। এবং দ্বিতীয়টি - আপনি ক্লায়েন্টের পক্ষ থেকে নির্গত বার্তার জন্য সাবস্ক্রাইব করতে ভুলে যান নি?
ভ্লাদিমির কুড়িভভ

এটির সাথে সমস্যাটি হ'ল আপনি কলব্যাকগুলি ব্যবহার করার ক্ষমতা হারাবেন, কারণ তাদের সম্প্রচারে অনুমতি নেই, যা আপনি এখানে যা করছেন সত্যই এটি তার ব্যক্তিগত ঘরে একটি সম্প্রচার।
ব্লুহল্লু

@ ভ্লাদিমিরকুরিজভ, মিঃ কাঁচা রুমগুলি ব্যবহার করতে চান না এবং আমি সম্মত হই যে এটি তার সমস্যার সমাধান নয়।
মিক্সেইআই

4

আমাদের সংস্থার একটি প্রকল্পে আমরা "কক্ষগুলি" পদ্ধতির ব্যবহার করছি এবং এর নামটি একটি অনন্য সনাক্তকারী হিসাবে আমাদের কথোপকথনে সমস্ত ব্যবহারকারীর আইডির সংমিশ্রণ (আমাদের প্রয়োগটি আরও বেশি ফেসবুক মেসেঞ্জারের মতো), উদাহরণস্বরূপ:

| আইডি | নাম | 1 | স্কট | 2 | সুসান

"কক্ষ" নামটি "1-2" হবে (আইডিকে Asc দেওয়া হয়)) এবং সংযোগ বিচ্ছিন্ন করার সময়। স্বয়ংক্রিয়ভাবে ঘরটি পরিষ্কার করে দেয়

আপনি কেবল সেই ঘরে এবং শুধুমাত্র অনলাইন (সংযুক্ত) ব্যবহারকারীদের (পুরো সার্ভার জুড়ে কম প্যাকেজ পাঠানো) বার্তাগুলি প্রেরণ করেন।


3

যেমন এজিআআআর উত্তরটি সুন্দরভাবে বলা হয়েছে তবে আসুন আমি এটি সকেট.আইওরুমগুলির সাথে আরও সহজ করে তুলি। কোনও সার্ভারে যোগদানের জন্য একটি অনন্য শনাক্তকারী সহ একটি সার্ভারকে অনুরোধ করুন। এখানে আমরা একটি অনন্য সনাক্তকারী হিসাবে একটি ইমেল ব্যবহার করছি।

ক্লায়েন্ট সকেট.আইও

socket.on('connect', function () {
  socket.emit('join', {email: user@example.com});
});

যখন ব্যবহারকারী কোনও সার্ভারে যোগদান করেন, তখন সেই ব্যবহারকারীর জন্য একটি ঘর তৈরি করুন

সার্ভার সকেট.আইও

io.on('connection', function (socket) {
   socket.on('join', function (data) {    
    socket.join(data.email);
  });
});

এখন আমরা সবাই যোগদানের জন্য প্রস্তুত। সার্ভার toরুম থেকে কিছু প্রেরণ দিন , যাতে ব্যবহারকারী শুনতে পারে।

সার্ভার সকেট.আইও

io.to('user@example.com').emit('message', {msg: 'hello world.'});

messageক্লায়েন্ট পক্ষের ইভেন্ট শোনার সাথে বিষয়টিকে চূড়ান্ত করতে দিন

socket.on("message", function(data) {
  alert(data.msg);
});

সকেট.আইও রুম থেকে রেফারেন্স


4
মনে হচ্ছে আপনার উত্তরটি নীচে থেকে @ আজআর এর উত্তরের একটি অনুলিপি , আপনি যদি কারও উত্তর পরিবর্তন করে ব্যবহার করেন তবে ক্রেডিট দিন
রাহুল গৌর

আপনাকে @ রাহুলগৌর ধন্যবাদ, হ্যাঁ এটি একটি অনুলিপি নয়। তবে অবশ্যই আমার উত্তর বদলে গেছে। তিনি inএকটি ইভেন্ট নির্গত করতেন । তবে আমার ক্ষেত্রে, আমি toএকটি ইভেন্ট নির্গত করতে ব্যবহার করেছি । আমি আশা করি আপনি এটি আগে দেখেছেন
ললিত মোহন

এটি অনুলিপি নয় শুনে ভাল লাগল, তবে এটি অনুপ্রাণিত বলে মনে হয়, তাই credit
ণ দেওয়া

4
খ্যাত ভাই, এটি অবশ্যই করবেন আপনি @ রাহুলগৌরকে ধন্যবাদ জানান।
ললিত মোহন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.