בדיקה האם המשתמש מחובר כעת
-
כשיש מערכת משתמשים, אני רוצה לדעת האם משתמש מסויים מחובר כעת.
לא משנה באיזה פלטפורמה (אקסס, WPF, WINFORM וכו ) -- למעט ווב, יש לי קושי לדעת מי מחובר כעת.
אז ככה: מה אני עשיתי, ואיפה אני מסתבך.
נתחיל איפה זה עובד מצויין: בווב.
בווב זה עובד מצויין כי תמיד אני יכול לדעת מי מהסש'נים מחובר כעת, ואם זה המשתמש הנוכחי אני יכול לחסום אותו וכו'.איפה זה לא עובד? ניקח לדוגמא את WinForm - כשהדוגמא שאני מדבר עליה היא עבודה על תוכנה אחת ממחשבים מרובים.
מה ניסיתי?- יש לי עמודה בטבלת המשתמשים שמסומנת כשהמשתמש התחבר, ואני מוריד את הסימון כשהתוכנה נסגרת.
זה לא מושלם: א. אם התוכנה "עפה" ע"י סגירת הפרוסס או כיבוי לא מבוקר, אין יציאה מסודרת ולכן הV של ה"משתמש מחובר" לא יורד. ב. אם אני רוצה לאפשר לאותו משתמש להיות מחובר עד כמה פעמים (נניח 3), אז אני לא יכול לדעת כמה פעמים, וכן ברגע שהמשתמש יצא פעם אחת הוא כבר מסומן כלא מחובר בכלל - אפילו שהוא מחובר עוד פעמיים. - נעילת הרשומה של המשתמש - לא מושלם - בעיקר בגלל סיבה ב' דלעיל.
- כתיבה לקובץ פיזי והשארתו "תלוי באוויר" כל זמן שהתוכנה פתוחה - אם התוכנה "עפה" הקובץ משתחרר לדוגמא משתמש שהID שלו הוא 1 אז הקובץ יהיה U1 וכו'. ואז אני יודע אם הקובץ תפוס או לא. -- זה עובד מצויין, הבעייה שזה עובד רק במקומי והרי לפעמים עובדים עם אותו משתמש מכמה מחשבים.
יש רעיונות???
פורסם במקור בפורום CODE613 ב23/04/2014 20:29 (+03:00)
- יש לי עמודה בטבלת המשתמשים שמסומנת כשהמשתמש התחבר, ואני מוריד את הסימון כשהתוכנה נסגרת.
-
חשבתי על זה.
2 בעיות:
התוכנה המרכזית זה שרת SQL.
לא בא לי להפעיל צד שרת TCP למקרה הספציפי הזה על השרת שלי (זה יהיה אמור לשרת הרבה "לקוחות" שלכל "לקוח" כמה משתמשים).
אם לא יהיה כאן רעיון אחר - זה מה שאני יעשה בסוף. בינתיים אני עוד מחפש...פורסם במקור בפורום CODE613 ב23/04/2014 22:39 (+03:00)
-
קודם כל, אני חייב לציין את העונג שעושה כזו שאלת איכות... תודה!
שים לב שהשוות את הבעיה שלך לשסנים של ווב. נו ואיך זה עובד שם? כמשתמש מסויים פונה פעם ראשונה הוא יוצר סשן בצד השרת, וע"י מאפיין timeout הוא מתפרק אחרי "נטישה ארוכה" - פרק זמן בהם אין פניה.
הבעיה שלך שאין לך צד שרת. יש לך אוסף קליינטים שעובדים ישירות מול SQL SERVER אז בעצם אין מי שינהל את השסנים, ובמחשבה שניה גם אין מי שיעשה עם המידע הזה משהו.אם אתה רוצה שקליינט יידע על קיומו של השני, אז צריך להשתמש אם תקשורת רשת בדיוק כמו שmagicode אמר, ולא ע"י מערכת הקבצים או מסד נתונים, שזו גישה מעוותת ובעייתית.
בשביל תקשורת רשת צריך לבחון בדיוק מה הצרכים, ולפי זה להחליט איך לממש את זה.
שים לב שייתכן שתרצה שאי פעילות בתוכנה תחשב גם היא ל"ניתוק", יש על זה "דיבורים" ברשת (למשל http://www.codeproject.com/KB/WPF/AutologoffWPF.aspx?msg=3238811)
פורסם במקור בפורום CODE613 ב24/04/2014 11:37 (+03:00)
-
אבל אם להישאר בגבולות הפיתרון שהיה תוכל לעשות במקום שדה בוליאני שדה מספרי, ולזרוק שם כל X זמן שאילתת שינוי המספר.
הפסקת התוכנה בכל דרך תפסיק את עדכון המספר והקליינטים האחרים יזהו "התיישנות" - אותו המספר ממשיך להתקיים וזה מראה שהעסק מת שם.
יש בזה חוסר יעילות מסויים לשגע את השרת הSQL בשביל מטרה כזו אבל הוא לא ייקח את זה קשהפורסם במקור בפורום CODE613 ב24/04/2014 19:59 (+03:00)
-
@דוד ל.ט.
אבל אם להישאר בגבולות הפיתרון שהיה תוכל לעשות במקום שדה בוליאני שדה מספרי, ולזרוק שם כל X זמן שאילתת שינוי המספר.
הפסקת התוכנה בכל דרך תפסיק את עדכון המספר והקליינטים האחרים יזהו "התיישנות" - אותו המספר ממשיך להתקיים וזה מראה שהעסק מת שם.
יש בזה חוסר יעילות מסויים לשגע את השרת הSQL בשביל מטרה כזו אבל הוא לא ייקח את זה קשהזה גם אחד הפתרונות שחשבתי עליהם, ואפשר גם לשים תאריך ושעה במקום מספר ולעדכן NOW (יותר קל לעקוב אחרי התיישנות)
אבל:- זה יהיה חייב להיות בטרד' אחורי, ובאקסס זה לא ישים (למעט אם משתמשים בטיימר דרך API) - הטיימר הרגיל לפעמים "תוקע את המערכת" כי הביצוע שלו נכנס באמצע קוד אחר.
- ואם זה תאריך ושעה צריך להתייחס לשעון קיץ וסטיות זמן וכו'.
- אם המשתמש יפתח את המסך שלו כדי לעדכן דברים (שם תצוגה וכו') - תהיה התנגשות כתיבה... (אפשר לפתור את זה ע"י טבלה נוספת ששם יהיה את שמות המשתמשים במקביל...)
נראה לי שאני נוטה בחזרה לכיוון סוקט TCP
פורסם במקור בפורום CODE613 ב24/04/2014 22:25 (+03:00)