PDA

View Full Version : حرفه ای: چگونگی اطلاع از ورود و خروج کاربران در برنامه تحت شبکه؟



havakili
جمعه 07 بهمن 1390, 16:07 عصر
من یک برنامه تحت شبکه نوشتم که کاربرام با user و pass
وارد سیستم میشن و در هر زمان هر نام کاربری فقط یک بار میتونه فعال باشه تو دیتابیسم یک فیلد دارم که اگر کاربری وارد شد مقدارش 1 میشه و نشون دهنده کاربران فعال هستش
و اگر دکمه خروج برنامه رو بزنه این مقدار 0 میشه
حالا اگر به هر دلیلی از روشی جز روش خروج اصلی برنامه,برنامه پایان یابد ( مثلا قطعی برق یا ری استارت شدن سیستم)اون مقدار 1 میمونه
و در ورود بعدی به کاربر گفته میشه که فعال است و اجازه ورود نمیده.
چطور میتونم این مشکل رو حل کنم
و راه حل پیشنهادی شما چیست؟
برنامه من با دلفی و بانک اطلاعاتی sql server 2008 هست

با تشکر قبلی

pezhvakco
جمعه 07 بهمن 1390, 19:14 عصر
می تونی یه تایمر در سمت سرور داشته باشی که در بازه زمان های مشخص بودن کاربران را مشخص نمایید .

havakili
جمعه 07 بهمن 1390, 22:58 عصر
خیلی ممنون از راهنماییتون
این راه حل به ذهن خودم رسیده بود ولی فکر کنم بازم راه حل مناسبتری بشه پیدا کرد؟
آیا کسی راه حل حرفه ای تری سراغ داره؟

Felony
جمعه 07 بهمن 1390, 23:27 عصر
موقعي كه كاربر به سرورت متصل ميشه آدرس IP ش رو در يك فيلد براي اون كاربر ذخيره كن ، دفعه بعد اگر كاربري تقاضاي اتصال با اين نام كاربري رو داد بررسي كن ببين آخرين كلاينت كه آدرس IP ش رو براي اين نام كاربري ذخيره كردي هنوز متصل هست يا نه اگر بود كه اجازه اتصال ديگه رو نميدي و اگرم نبود كه مجوز اتصال رو ميدي ، اينجوري به تايمر نيازي نيست و مشكل قطع شدن برق و ... هم از بين ميره .

havakili
شنبه 08 بهمن 1390, 12:03 عصر
سلام جناب تاجیک خیلی ممنون از راهنماییتون
اگه میشه بیشتر واسم توضیح بدید
من چه جوری باید بفهمم که آیا این ip با این نام کاربری به سرور هنوز وصل هست یا نه؟
خیلی به مشکل خوردم و باید زودتر حلش کنم
البته بدون کمک شما واسه من غیر ممکنه
خیلی ممنون میشم بیشتر توضبح بدین
آیا نیاز به استورد پروسیجر خاصی هست یا نه؟

hadisalahi2
شنبه 08 بهمن 1390, 16:33 عصر
خوب شما لزوما نباید بدونید اون کاربر با اون آی پی به شبکه وصل هست یا نه
شما باید هنگام ورود آدرس آی پی کامپیوتر کاربر رو در یک جدول ذخیره کنید و بعد از خروج از برنامه اون آدرس رو از جدول حذف کنید.

Felony
شنبه 08 بهمن 1390, 23:13 عصر
خوب شما لزوما نباید بدونید اون کاربر با اون آی پی به شبکه وصل هست یا نه
شما باید هنگام ورود آدرس آی پی کامپیوتر کاربر رو در یک جدول ذخیره کنید و بعد از خروج از برنامه اون آدرس رو از جدول حذف کنید.
خوب مشكل ايشون اين هست كه اگر يه وقت برق بره يا ... نميتونن همچين كارهايي رو انجام بدن !

سناريويي كه گفتم رو پياده كنيد , در زمان اتصال كلاينت جديد آدرس IP كلاينت قبلي رو بررسي كنيد ببينيد تو Binding List سرور هست يا خير , اگر نبود ميتونيد اجازه اتصال رو صادر كنيد .

havakili
یک شنبه 09 بهمن 1390, 13:04 عصر
سلام جناب تاجیک این binding list که می فرمائید من نتونستم در موردش چیزی پیدا کنم در صورت امکان ممنونم میشم اگه بیشتر توضیح بدهید یا یه نمونه واسم بزارید
با تشکر

hadisalahi2
یک شنبه 09 بهمن 1390, 20:26 عصر
فکر میکنم منظورشون از binding list یک جدول ساده داخل بانک اطلاعاتیه که اطلاعات آی پی اونجا ذخیره میشه
من هم یک برنامه اتوماسیون نوشتم که دقیقا همین مشکل رو داشتم.
من برای حل این مشکل یک برنامه پشتیبان گیری روی سرور دارم که ساعت 10 شب به صورت خودکار از بانک اطلاعاتی پشتییبان تهیه میکنه
هنگام پشتیبان گیری هم کلیه آی پی های داخل جدولم رو پاک میکنم تا فردا صبح که پرسنل وارد یوزر کاربریون میشن دیگه مشکلی از بابت وجود اطلاعات اشتباهی در مورد خروج نادرست نداشته باشند
یا حق

Delphi7_love
دوشنبه 10 بهمن 1390, 01:05 صبح
فکر میکنم منظورشون از binding list یک جدول ساده داخل بانک اطلاعاتیه که اطلاعات آی پی اونجا ذخیره میشه
من هم یک برنامه اتوماسیون نوشتم که دقیقا همین مشکل رو داشتم.
من برای حل این مشکل یک برنامه پشتیبان گیری روی سرور دارم که ساعت 10 شب به صورت خودکار از بانک اطلاعاتی پشتییبان تهیه میکنه
هنگام پشتیبان گیری هم کلیه آی پی های داخل جدولم رو پاک میکنم تا فردا صبح که پرسنل وارد یوزر کاربریون میشن دیگه مشکلی از بابت وجود اطلاعات اشتباهی در مورد خروج نادرست نداشته باشند
یا حق

پس با این حساب اگر یه کاربر به صورت غیر معقول (قطع برق) از برنامه خارج شد بهش میگیم شما تا فردا صبح صبر کن - حساب کتاباتو هم بذار واسه فردا ثبت کن

Felony
دوشنبه 10 بهمن 1390, 07:48 صبح
تو indy 9 توسط متد threads ميتونستي تعداد و ليست و ... كلاينت هاي متصل به سرور رو به دست بياري , تو indy 10 هم توسط context , يادم نيست اين ليست در شرايط غير عادي قطع اتصال كلاينت ها هم به روز ميشد يا نه , تست كن اگر جواب نداد بگو .

hadisalahi2
دوشنبه 10 بهمن 1390, 11:34 صبح
Delphi7_love
فکر میکنم شما اصلا تاپیک رو نخونده یه نظری دادی واسه محض رضای خدا.
اگه پست من رو بخونی ساعتش رو نوشتم چه ساعتی .نکنه شما تا ساعت 10 شب همه پرسنلت رو سر کار نگه میداری؟
بابا تو دیگه کی هستی؟؟؟؟؟؟؟؟؟؟؟!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!

mojiparadox
شنبه 15 بهمن 1390, 20:19 عصر
به نظر من باید یه لاگ واسه یوزرهات داشته باشی، هر کاری که یوزر انجام میده توی اون لاگ بنویسی، اگر توی یه مدت زمان خاص یوزر کاری انجام نده، میتونی از برنامه بندازیش بیرون!! البته با خروج یوزر می‌تونی اون لاگ رو پاک کنی تا حجم دیتابیست بالا نره...

میتونی از متدهای سرور / کلاینت Indy استفاده کنی (همون‌کاری که Messengerها برای اتصال و شناسایی قطع ارتباط استفاده می‌کنن) فقط نیازه که نرم‌افزار خیلی کم حجم روی سرور اجرا شه تا کلاینت‌ها رو شناسایی کنه... شاید بتونم توی این یه کم کمکت کنم...

hamidrah
دوشنبه 17 بهمن 1390, 11:45 صبح
چگونگی اطلاع از ورود و خروج کاربران در برنامه تحت شبکه؟
سلام به همه دوستان عزيز
منم دنبال اين موضوع بودم ، چون ميخوام در هر لحظه تعداد كاربران متصل به ديتايسم رو بدونم
كد زير تعداد كاربران متصل به ديتابيستون رو ميگه :

SELECT DB_NAME(dbid) as 'Database Name',
COUNT(dbid) as 'Total Connections'
FROM sys.sysprocesses WITH (nolock)
WHERE dbid > 0 and DB_NAME(dbid) like '%نام ديتابيس%'
GROUP BY dbid
البته در SQL 2005 كردم ، لطفا تو SQL 2008 تست كردين بهم خبر بدين درسته يا نه.
براي اينكار هم بايد از Stored Procedure ها استفاده كنيد.
كد زير رو هم در اس كيو ال 2005 تست كردم ، اگه تو 2008 هم جواب داد بهم بگين :

select endpoints.name

, endpoints.protocol_desc

, sessions.host_name

, sessions.program_name

, sessions.login_name

, sessions.status

from sys.dm_exec_sessions sessions

left outer join sys.endpoints endpoints

on sessions.endpoint_id = endpoints.endpoint_id

where sessions.host_name is not null

order by endpoints.name

شما ميتونيد با استفاده از اين كد و Stored Procedure ها بفهميد كدوم كاربران متصلند

لطفا منو از نتيجه كار بي خبر نذارين.:متفکر:

delphidark
دوشنبه 17 بهمن 1390, 12:58 عصر
درود

متاسفانه اون دوستی که تاپیک رو زدند عنوان نکردند که برنامه رو به صورت Client نوشتن که به Mssql متصل میشه و یا به صورت یک معماری چند لایه با DataSnap

در حالت دوم یعنی DataSnap بدیهی هست که باید درخواست های ارسال شده به لایه میانیLOG بشه , در واقع به نوعی باید یک session پیاده سازی بشه که در صورتی که کلاینت خارج از زمان انقضای آن درخواستی داد نیاز به Login مجدد داشته باشه ...

در حالت اول اما بسته به نوع بانک اطلاعاتی مورد نظر باید از StoredProcedure ها استفاده کرد
در مورد اول هم بنده از Mysql استفاده میکنم و صرفا در مورد این db میتونم راهنمایی کنم ...

موفق باشید...

SayeyeZohor
دوشنبه 22 اسفند 1390, 16:35 عصر
با سلام
به نظر من مي تونيد از thread يا تايمر استفاده كنيد
اينطور كه هر كاربر كه لاگين ميشه هر دو دوقيقه يكبار حضور خودشو با گذاشتن تاريخ و ساعت در ديتابيس سرور اعلام كنه
با اين روش اگه برق هم برود شما ميتونيد با كم كردن تاريخ و ساعت قبلي از ساعت فعلي و چك كردن اينكه از دو دقيقه بيشتر نبوده ، حضور كاربرتون رو چك كنيد
اگه كسي روش ديگه اي هم داره بگه
ممنون

Delphi 2010
پنج شنبه 17 فروردین 1391, 16:20 عصر
با دستور Ping کارت حل میشه