ارسال پیام به کاربر خاص تو نود جی اس به صورت ساکت

92 views
Skip to first unread message

مهدی پیشگوی

unread,
Feb 3, 2016, 9:15:09 AM2/3/16
to nodejs-fa
سلام دوستان. فرض کنید ما یه چت راه انداختیم که کاربرا توش  ثبت نام و لاگین میکنن. من مشکلم اینه نمیتونم درست بفهمم چطور میتونم به یه کاربر خاص پیام بفرستم. فرض کنید هزار نفر الان آنلاین هستن به یه کاربر خاصی یه کاربر دیگه به صورت خصوصی مثلا میخواد پیام بفرسته یا خود ما بخواییم به یه کاربر خاص شخصا اطلاع رسانی کنیم مثل همین نرم افزارهای شبکه های اجتماعی. این روالش به چه صورت؟ چطور میتونیم یه کاربر رو مخاطب قرار بدیم و براش ارسالی داشته باشیم؟

Touhid Arastu

unread,
Feb 3, 2016, 10:57:12 AM2/3/16
to node...@googlegroups.com
سلام

در ساده ترین حالت بدون استفاده ار Redis و یا هر Solution دیگه، اینکار رو اینجوری باید انجام بدی:
var clients = [];
io.sockets.on('connection', function (socket) {
clients.push(socket.id);
});
در مرحله بعد بهتره مثلا هر کاربری برای خودش یه اسم مستعار انتخاب کنه و ارسال کنه که در اون صورت اینجوری میشه کد:

var clients = [];
io.sockets.on('connection', function (socket) {
socket.on("nickName", function (nickName) {
clients.push({
nickName: nickName,
socketId: socket.id
});
})
});
الان بخوای به هر کاربری پیام بفرستی باید سرچ کنی تو این آرایه clients و سوکت آی دیش رو پیدا کنی و اینجوری بهش پیام بفرستی.
مثلا اینجا به یه سوکت آی دی خاص مسیج فرستادم.
if (io.sockets.connected[socketId]) {
io.sockets.connected[socketId].emit('message', 'Hey to :), inja ro bebin ;)');
}





2016-02-03 17:45 GMT+03:30 مهدی پیشگوی <pis...@gmail.com>:
سلام دوستان. فرض کنید ما یه چت راه انداختیم که کاربرا توش  ثبت نام و لاگین میکنن. من مشکلم اینه نمیتونم درست بفهمم چطور میتونم به یه کاربر خاص پیام بفرستم. فرض کنید هزار نفر الان آنلاین هستن به یه کاربر خاصی یه کاربر دیگه به صورت خصوصی مثلا میخواد پیام بفرسته یا خود ما بخواییم به یه کاربر خاص شخصا اطلاع رسانی کنیم مثل همین نرم افزارهای شبکه های اجتماعی. این روالش به چه صورت؟ چطور میتونیم یه کاربر رو مخاطب قرار بدیم و براش ارسالی داشته باشیم؟

--
You received this message because you are subscribed to the Google Groups "nodejs-fa" group.
To unsubscribe from this group and stop receiving emails from it, send an email to nodejs-fa+...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.



--
Best Regards,
Touhid Arastu
Web Geek
touhid...@gmail.com

“Be the change that you wish to see in the world.”
― Mahatma Gandhi

Touhid Arastu

unread,
Feb 3, 2016, 11:05:44 AM2/3/16
to node...@googlegroups.com
یعنی به ازای هر سوکت ما یه Instance از اون سوکت داریم که اطلاعاتش توشه مثل همین ID که تو مثاله که شما با یه چیزی از کاربر باید بایندش کنید و بعدن بتونید اینا را با هم مپ کنید، کلیتا اینطوریه.

mahdi pishguy

unread,
Feb 3, 2016, 11:24:52 AM2/3/16
to nodejs-fa
این سرچ تو آرایه زمان بر نیست که بخواییم کاربر رو پیدا کنیم؟ منظورم نام کاربری هستش

Touhid Arastu

unread,
Feb 3, 2016, 12:56:41 PM2/3/16
to node...@googlegroups.com

این یه مثال خیلی ساده بود و خب قاعدتا تو مقیاس بزرگ خیلی زمانبره، معمولا اینجور موقعها از یه دیتابیس in memory مثل redis استفاده می کنند و کانکشنها رو تو اون نگه می دارد که برای سرچم سریع باشه. تو اینترنت پیاده سازی هاشو راحت پیدا می کنید.

On Feb 3, 2016 7:54 PM, "mahdi pishguy" <pis...@gmail.com> wrote:
این سرچ تو آرایه زمان بر نیست که بخواییم کاربر رو پیدا کنیم؟ منظورم نام کاربری هستش

--

mahdi pishguy

unread,
Feb 3, 2016, 2:00:11 PM2/3/16
to nodejs-fa

اره درسته حق باشماست ولی مثال خوبی ارایه کردید به این نوع مثال خیلی احتیاج داشتم ممنون.
تو این مثال شما. ساکت آی دی ها یا نیک نیم ها فقط تو دیتابیس هایی مثل redisذخیره میشن دیگه درسته؟

Touhid Arastu

unread,
Feb 3, 2016, 3:31:08 PM2/3/16
to node...@googlegroups.com

آره تقریبا

On Feb 3, 2016 10:30 PM, "mahdi pishguy" <pis...@gmail.com> wrote:

اره درسته حق باشماست ولی مثال خوبی ارایه کردید به این نوع مثال خیلی احتیاج داشتم ممنون.
تو این مثال شما. ساکت آی دی ها یا نیک نیم ها فقط تو دیتابیس هایی مثل redisذخیره میشن دیگه درسته؟

--

mahdi pishguy

unread,
Feb 3, 2016, 3:46:28 PM2/3/16
to nodejs-fa
​تقریبا؟ منظورتون چی هستش؟ یه نمونه میشه بگید بدونم؟

Touhid Arastu

unread,
Feb 4, 2016, 1:36:42 AM2/4/16
to node...@googlegroups.com
این ساده ترین حالتیه که میشه تو ردیس این کار رو کرد، برای کارای خفن تر و پیشرفته تر می تونید گوگل کنید.


var redis = require('redis');
var redisClient = redis.createClient(); //creates a new client

io.sockets.on('connection', function (socket) {
socket.on("nickName", function (nickName) {
    redisClient.set([nickName, socket.id]);
})
});


//send message to arastu
redisClient.get('arastu', function(err, socketId) {

if (io.sockets.connected[socketId]) {
io.sockets.connected[socketId].emit('message', 'Hey to :), inja ro bebin ;)');
}
});

البته میشه از دیتا تایپ های دیگر ردیس هم استفاده کرد. ولی خب این ساده ترین شکل استفاده است.







On Thu, Feb 4, 2016 at 12:16 AM, mahdi pishguy <pis...@gmail.com> wrote:
​تقریبا؟ منظورتون چی هستش؟ یه نمونه میشه بگید بدونم؟

--
You received this message because you are subscribed to the Google Groups "nodejs-fa" group.
To unsubscribe from this group and stop receiving emails from it, send an email to nodejs-fa+...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Touhid Arastu

unread,
Feb 4, 2016, 1:39:20 AM2/4/16
to node...@googlegroups.com
یکم رنگها تو کد واضح نبود دوباره می‌فرستم:


var redis = require('redis');
var redisClient = redis.createClient(); //creates a new client

io.sockets.on('connection', function (socket) {
socket.on("nickName", function (nickName) {
redisClient.set([nickName, socket.id]);
})
});


//send message to arastu
redisClient.get('arastu', function(err, socketId) {
if (io.sockets.connected[socketId]) {
io.sockets.connected[socketId].emit('message', 'Hey to :), inja ro bebin ;)');
}
});

mahdi pishguy

unread,
Feb 4, 2016, 1:40:32 AM2/4/16
to nodejs-fa

دستت درد نکنه.عالی بود ممنون

Touhid Arastu

unread,
Feb 4, 2016, 1:43:28 AM2/4/16
to node...@googlegroups.com
خواهشم :) روزگار خوب و خوش

On Thu, Feb 4, 2016 at 10:10 AM, mahdi pishguy <pis...@gmail.com> wrote:

دستت درد نکنه.عالی بود ممنون

--
You received this message because you are subscribed to the Google Groups "nodejs-fa" group.
To unsubscribe from this group and stop receiving emails from it, send an email to nodejs-fa+...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

مهدی پیشگوی

unread,
Feb 13, 2016, 9:43:10 AM2/13/16
to nodejs-fa
سلام. تفاوت دو تا موضوع رو اینجا میخواستم بپرسم. شما تو کد بالایی که استفاده کردید برای ارسال پیام به یه کاربر. من این مثال رو تو یکی از مثالها دیدم. تفاوت خاصی دارن میخواستم ببینم آیا از اینا میتونم استفاده کنم یا نه. تفاوتی دارن تو مرحله اجرا یا نه
لینک میدم ببینید که دیگه مشکلی از بابت فرمت و رنگ بندی نداشته باشه

https://github.com/Gottox/socket.io-java-client/blob/master/examples/chat/server.js#L18

منظورم قسمتهای
socket.broadcast.emit
و قسمت

io.sockets.emit
هستش. اولی باید برای ارسال به یه سوکت باشه دومی به کل سوکتهایی که کانکت هستن اگه اشتباه نکنم البته. ممنون که جواب میدین

ـــــــــــــــ> این ادیتور چرا دایرکشن فارسی نداره؟ فقط راست چین میشه

Touhid Arastu

unread,
Feb 13, 2016, 4:38:06 PM2/13/16
to node...@googlegroups.com
من کامل متوجه منظورت نشدم، ولی socket.broadcast.emit یعنی پیامو رو به همه کلاینتها به جز همین کلاینت یه مسیج رو ارسال کن یا امیت کن.
​و io.sockets.emit یعنی امیت کردن یک مسیج به همه کلاینتها

تو لینکی که فرستادی


socket.broadcast.emit('announcement', {user: nickname, action: 'connected'});
io.sockets.emit('nicknames', nicknames);

خط اول به همه کلاینها به جز خود همین کسی که nickname رو فرستاده می‌گه که فلانی کانکت شده، و تو خط بعدی به همه حتی خود همین یارو لیست کسایی که الان کانکت هستند رو می‌فرسته.

امیدوارم جوابی که منتظرش بودی همین بوده باشه :)

--
You received this message because you are subscribed to the Google Groups "nodejs-fa" group.
To unsubscribe from this group and stop receiving emails from it, send an email to nodejs-fa+...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

مهدی پیشگوی

unread,
Feb 14, 2016, 4:03:11 AM2/14/16
to nodejs-fa
اره. دست گلت درد نکنه. من فکر کردم اونایی که من نوشتم برای ارسال به ساکتی که کانکت میشن هم به کار میرن. پس اشتباه کرده بودم. ممنون که بهم گفتی. دست گلت درد نکنه

مهدی پیشگوی

unread,
Feb 27, 2016, 2:35:56 PM2/27/16
to nodejs-fa

سلام آقای ارسطو. یه سوال تو این مثالی که زدید چرا دو تا تابع تو در تو شده؟  منظورم کانکشن و نیک نیم هستش




io
.sockets.on('connection', function (socket) {
socket.on("nickName", function (nickName) {

Touhid Arastu

unread,
Feb 29, 2016, 12:01:51 AM2/29/16
to node...@googlegroups.com

اولی callback مربوط به event کانکشن همه سوکتهاست، دومی callback مربوط به ارسال nickname در یک سوکت خاص است.

نکته اینه که به ازای هر کانکشن مربوط به سوکت ها یک کالبک اجرا میشه که argumentش یه آبجکته که مپ شده به همون سوکت، حالا ما رو همه سوکت ها به ایونت مربوط به ارسال نام مستعار هم گوش می دیم و براش callback ست میکنیم.

mahdi pishguy

unread,
Feb 29, 2016, 12:19:35 AM2/29/16
to nodejs-fa

اهان الان متوجه شدم حواسم نبود فکر کردم به ازای هر کودومش کانکشن رو دوباره مینویسیم.ممنون

مهدی پیشگوی

unread,
Aug 3, 2016, 9:59:27 AM8/3/16
to nodejs-fa
سلام آقای ارسطو

این موضوع رو دارم پیاده سازی میکنم یه سوالی داشتم. وقتی که با تابع زیر میاییم به اون ردیس ست میکنیم نام کاربری و سوکت آی دی رو وقتی که اتصال قطع میشه دوباره ست کردن اون باعت میشه که رکورد جدید ایجاد بشه؟ یعنی ممکنه از اون نام کاربری چند تا ایجاد بشه؟ یه از بیین میره اون آبجکت؟


socket.on('userConnected', function (data) {
redisClient.set([data.username, socket.id]);
});


mahdi pishguy

unread,
Aug 3, 2016, 10:10:46 AM8/3/16
to node...@googlegroups.com
راهی که من انتخاب کردم. گفتم بعد از هر باری که کاربر لاگین میشه این دستورات اجرا بشه

socket.on('userConnected', function (data) {
    client.keys(data.username, function (err, keys) {
if (err) return;
if (keys.length === 0)
redisClient.set([data.username, socket.id]);
else {
redisClient.del(data.username);
            redisClient.set([data.username, socket.id]);
}
});
});
​اول میگردم اگه قبلا ست شده باشه پاکش میکنم بعد دوباره ست میکنم

Reply all
Reply to author
Forward
0 new messages